Flutter: поток StreamBuilder не обновляется

Мой StreamBuilder не обновлялся после изменений в потоке, а также поток не обновляется при извлечении данных из Firebase и сохранении их в локальной базе данных SQLite;

А вот мой код для прослушивания изменений данных из Firebase и записи этих новых чатов на локальный :

          /// LISTEN TO THE STREAM FROM FIREBASE AND THEN WRITE THE NEW MESSAGES TO THE LOCAL DATASE

  // Fetch normal messages
      firestore.fetchMessagesStream(chatRoomId).listen((event) async {
        for (QueryDocumentSnapshot message in event.docs) {
          MySqlite.insertData(
            table: 'Messages',
            data: message.data()!,
          );
        }
      });
      // Fetch calls
      firestore.fetchCallsStream(chatRoomId).listen((event) async {
        for (QueryDocumentSnapshot call in event.docs) {
          MySqlite.insertData(
            table: 'Calls',
            data: call.data()!,
      );
      // Fetch posts
      firestore.fetchHoodPostsStream(chatRoomId).listen((event) async {
        for (QueryDocumentSnapshot post in event.docs) {
          MySqlite.insertData(
            table: 'Posts',
            data: post.data()!,
          );
        }
      });

А вот код для извлечения данных из локальной базы данных SQLite :

      /// STREAM FOR LISTENING THE CHANGES IN THE LOCAL DATABASE

Rx.combineLatest3(
      MySqlite.fetchMessagesStream(hoodId), // Returns the stream of the Messages Table in local databases
      MySqlite.fetchPostsStream(hoodId), // Returns the stream of the Posts Table in local databases
      MySqlite.fetchCallsStream(hoodId), // Returns the stream of the Calls Table in local databases
      (List<Map<String, dynamic>> streamingMessages,
          List<Map<String, dynamic>> streamingPosts,
          List<Map<String, dynamic>> streamingCalls) {
        /// VERY IMPORTANT: THE FOLLOWING PRINT STATEMENT WILL BE PRINT OUT EVERYTIME A NEW CHAT ARRIVE
        /// VERY IMPORTANT: THE FOLLOWING PRINT STATEMENT WILL BE PRINT OUT EVERYTIME A NEW CHAT ARRIVE
        /// VERY IMPORTANT: THE FOLLOWING PRINT STATEMENT WILL BE PRINT OUT EVERYTIME A NEW CHAT ARRIVE
        /// VERY IMPORTANT: THE FOLLOWING PRINT STATEMENT WILL BE PRINT OUT EVERYTIME A NEW CHAT ARRIVE
        /// VERY IMPORTANT: THE FOLLOWING PRINT STATEMENT WILL BE PRINT OUT EVERYTIME A NEW CHAT ARRIVE
        print('MySqlite: chat stream changes!');

        final List<dynamic> contents = [...streamingMessages, ...streamingPosts, ...streamingCalls];

        return contents;
      },
    );
  }

Ожидаемый график отправки нового сообщения будет следующим:

Пользователь отправил сообщение -> инициировать изменения в Firebase -> запустить поток, который LOCAL SQLite прослушивает для добавления новых данных -> запустить функцию, которая прослушивает базу данных SQLite для обновления -> ChatScreen должен обновиться, а также новое сообщение отладки: «MySqlite: поток чата изменяется!» следует снова распечатать в консоли, потому что база данных LOCAL SQLite изменилась.

Но реальный результат таков:

Пользователь отправил сообщение -> успешно инициировать изменения в Firebase -> но я НЕ увидел обновляющийся экран ИЛИ новое сообщение отладки в консоли ...

Я боролся с этой проблемой в течение нескольких дней, и я не знаю, почему результат не тот, который я хочу, если я позволю ChatScreen напрямую прослушивать Firebase, он работает! *

1 ответ

Я только что узнал, что функция SQLite.query не может быть получена как Stream, и я подумал, что могу использовать метод asStream, но это ничего не делает, это пропущенная функция, которую пакет SQLite еще не реализовал, поэтому я добавляю пакет sqlbrite, который работает как оболочка исходного пакета SQLite, и у него есть некоторые дополнительные функции, такие как запрос данных в виде потока. ^_^

Другие вопросы по тегам