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, и у него есть некоторые дополнительные функции, такие как запрос данных в виде потока. ^_^