Здравствуйте, я работаю с базой данных Fire Fire для того, чтобы сделать один на один чат между пользователями. Здесь я хочу несколько постраничных сообщений. Итак, я вызвал прослушиватель снимков внутри initState Так что проблема в том, что когда я перехожу на экран чата, initState вызвал прослушиватель снимков DocumentType.added . поэтому данные становятся дубликатами ..
вот мой код, который я вызвал внутри initState
List<DocumentSnapshot> _products = [];
StreamController<List<DocumentSnapshot>> _streamController =
StreamController<List<DocumentSnapshot>>.broadcast();
@override
void initState() {
db
.collection('chat')
.document(docId)
.collection('messages')
.orderBy('timestamp', descending: true)
.snapshots().listen((data) => onChangeData(
data.documentChanges,
));
}
void onChangeData(
List<DocumentChange> documentChanges,
) {
documentChanges.forEach((productChange) {
if (productChange.type == DocumentChangeType.removed) {
_products.removeWhere((product) {
return productChange.document.documentID == product.documentID;
});
_streamController.add(_products);
}
if (productChange.type == DocumentChangeType.added) {
_products.insert(productChange.newIndex, productChange.document);
_streamController.add(_products);
}
if (productChange.type == DocumentChangeType.modified) {
int indexWhere = _products.indexWhere((product) {
return productChange.document.documentID == product.documentID;
});
if (indexWhere >= 0) {
_products[indexWhere] = productChange.document;
}
_streamController.add(_products);
}
});
}