appwrite / sdk-for-flutter

[READ-ONLY] Official Appwrite Flutter SDK πŸ’™
https://appwrite.io
BSD 3-Clause "New" or "Revised" License
364 stars 109 forks source link

πŸ› Bug Report: Realtime does not reconnect when connection is lost #107

Closed merabtenei closed 1 year ago

merabtenei commented 1 year ago

πŸ‘Ÿ Reproduction steps

I'm using Flutter and below is a very simple app that will reproduce this behavior.

import 'package:appwrite/appwrite.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Appwrite Realtime Test',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Appwrite Realtime Test'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});
  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  Client client = Client();

  late RealtimeSubscription subscription;

  @override
  void initState() {
    client
            .setEndpoint(
                'https://xxxxxxxx.xxx/v1') // Your Appwrite Endpoint
            .setProject('xxxxx') // Your project ID
            .setSelfSigned() // Use only on dev mode with a self-signed SSL cert
        ;
    Realtime realtime = Realtime(client);
    subscription =
        realtime.subscribe(['databases.xxxxx.collections.xxxxx.documents']);
    subscription.stream.listen((event) => print('Received event'),
        onDone: () => print('DONE'), onError: (error, st) => print('ERROR'));

    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: StreamBuilder(
          stream: subscription.stream,
          builder: (context, snapshot) {
            if (snapshot.hasData && snapshot.data != null) {
              return Text(snapshot.data!.payload.toString());
            } else if (snapshot.hasError) {
              return Tooltip(
                message: snapshot.error.toString(),
                child: const Icon(Icons.error),
              );
            } else {
              return const CircularProgressIndicator();
            }
          },
        ),
      ),
    );
  }
}

πŸ‘ Expected behavior

One of two scenarios :

πŸ‘Ž Actual Behavior

🎲 Appwrite version

Version 2.0.x

πŸ’» Operating system

Linux

🧱 Your Environment

No response

πŸ‘€ Have you spent some time to check if this issue has been raised before?

🏒 Have you read the Code of Conduct?

lohanidamodar commented 1 year ago

Duplicate #108