Проблема дублирования данных приемника снимков Firestore во флаттере - PullRequest
0 голосов
/ 24 января 2020

Здравствуйте, я работаю с базой данных 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);   
    }
  });
}

1 Ответ

0 голосов
/ 30 января 2020

Это нормальное поведение - когда вы присоединяете слушателя к документу или коллекции, вы сначала получаете обратный вызов с текущими данными, а затем последующие вызовы при каждом изменении данных.

Поскольку вы используете нумерация страниц и добавление нового слушателя в пределах initState каждой из страниц, вы получаете первый обратный вызов при каждом изменении страницы.

Что вам нужно сделать, это создать отдельный класс, отвечающий за прослушивание вашей коллекции и уведомление о любых виджетах, которые должны быть обновлены. Вы можете использовать выбранную вами библиотеку управления состояниями для уведомления виджетов об изменениях данных.

...