asyn c Future не работает в моем коде. Как это исправить? - PullRequest
0 голосов
/ 07 мая 2020

Эта функция всегда возвращает null, но загружает данные, но не ожидает чтения Firestore. Как решить эту проблему?

 Future<HomePage> read({ String pageName,String mAppId})async{

  await Firestore.instance
       .collection('tablePages')
       .where('projectId', isEqualTo: mAppId)
       .where("page.title", isEqualTo:pageName)
       .snapshots()
       .listen((data) async{
     if (data.documents != null
         ? data.documents.length > 0
         ? data.documents[0].data != null
         : false
         : false) {


        return HomePage.fromJson(
            data.documents[0].data['page']);
     } else {

       return null;
     }

     //break;
   }).onError((error){

    print(error);
     return null;
   });

  }
}

1 Ответ

0 голосов
/ 07 мая 2020

Попробуйте следующее:

  Future<HomePage> read({String pageName, String mAppId}) async {
    Stream<QuerySnapshot> snap = Firestore.instance
        .collection('tablePages')
        .where('projectId', isEqualTo: mAppId)
        .where("page.title", isEqualTo: pageName)
        .snapshots();
    await for (var data in snap) {
      if (data.documents != null
          ? data.documents.length > 0 ? data.documents[0].data != null : false
          : false) {
        return HomePage.fromJson(data.documents[0].data['page']);
      } else {
        return null;
      }
    }
  }

Из документов:

Потоки можно создавать разными способами, что является топом c для другой статьи, но они все могут использоваться одинаково: асинхронный для l oop (обычно называемый просто await for) перебирает события потока, как for l oop перебирает Iterable. Например:

Future<int> sumStream(Stream<int> stream) async {
  var sum = 0;
  await for (var value in stream) {
    sum += value;
  }
  return sum;
}

Этот код просто принимает каждое событие потока целочисленных событий, складывает их и возвращает (будущее) сумму. Когда тело l oop заканчивается, функция приостанавливается до прибытия следующего события или завершения потока.

https://dart.dev/tutorials/language/streams

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