Почему будущее forEach зацикливается больше, чем ожидалось? - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть две функции, Первый, чтобы получить пользователей из Firestore. Затем я использую "Future.ForEach", чтобы зациклить этих пользователей.

 Future<List> getData() async {
    targetData.clear();

    await Firestore.instance
        .collection('users')
        .document(currentUserId)
        .collection('chats')
        .getDocuments()
        .then((userChats) async {
          // Only two documents are coming from the db
      return await Future.forEach(userChats.documents, getTargetData)
          .then((onValue) {
        print('forEech is done');
      });
    });

    print('getData Returen');
    // I use "targetData" to build viewList
    return targetData;
  }

Вызов этой функции из Future.forEach

  Future<List> getTargetData(DocumentSnapshot targetDoc) async {
    print('looping');

    await Firestore.instance
        .collection('users')
        .document(targetDoc.documentID)
        .get()
        .then((targetRef) {
      targetData.add(new TargetUserData(
          targetRef.documentID,
          targetRef.data['nickname'],
          targetRef.data['photoUrl'],
          targetDoc.data['timestamp'],
          targetRef.data['token'],
          targetDoc.data['unseen']));
    });

    return targetData;
  }

Я звоню getData из FutureBuilder

return new FutureBuilder(
 future: getData(),
 builder: (BuildContext context, AsyncSnapshot snapshot) {
  switch (snapshot.connectionState) {
   case ConnectionState.none:
   case ConnectionState.waiting:
    return buildLoading();
   default:
    if (snapshot.hasError)
      return new Text('Error: ${snapshot.error}');
   else
      return createListView(context, snapshot);
   }
 },
);

Когда я запускаю приложение, оно работает отлично и, как и ожидалось, - вот журнал из оператора печати:

  • I / флаттер (18780): цикл
  • I / флаттер (18780): циклический I / флаттер
  • (18780): forEech сделано
  • I / флаттер (18780): getDataReturen

Горячий перезапуск - первый запуск

Я ожидаю при горячей перезагрузке, что получаю тот же результат, но что будет !!

  • I / флаттер (18780): цикл
  • I / флаттер (18780): цикл
  • I / флаттер (18780): цикл
  • I / флаттер (18780): forEech сделано
  • I / флаттер (18780): getDataReturen
  • I / флаттер (18780): forEech сделано
  • I / флаттер (18780): getDataReturen

Горячие перезагрузки ...

Вопрос: Почему forEach зацикливается больше, чем ожидалось?

1 Ответ

0 голосов
/ 13 ноября 2018

Я смог решить эту проблему путем изменения кода:

  Future<List> _getData() async {
    var allUsers = await Firestore.instance.collection('users').getDocuments();

    List<TargetUserData> users = [];
    for (var userData in allUsers.documents) {
      if (currentUserId != userData.documentID) {
        await getTargetData(userData.documentID).then((targetData) {
          TargetUserData targetUserData = TargetUserData(
              userData.documentID,
              userData.data['nickname'],
              userData.data['photoUrl'],
              targetData[0],
              userData.data['token'],
              targetData[1],
              targetData[2]);
          users.add(targetUserData);
        });
      }
    }
    return users;
  }





Future getTargetData(var targetId) async {
    List targetData = [];

    await Firestore.instance
        .collection('users')
        .document(currentUserId)
        .collection('chats')
        .document(targetId)
        .get()
        .then((advData) {
      if (advData.data != null) {
        targetData.add(advData.data['timestamp']);
        targetData.add(advData.data['unseen']);
        targetData.add(advData.data['lastMsg']);
      } else {
        targetData.add('0');
        targetData.add('0');
        targetData.add('Start Chating!');
      }
    }).catchError((onError) {
      print('on error: $onError');
    });

    return targetData;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...