-1

此函数始终返回 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;
   });

  }
}
4

1 回答 1

0

尝试以下操作:

  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;
      }
    }
  }

从文档:

可以通过多种方式创建流,这是另一篇文章的主题,但它们都可以以相同的方式使用:异步 for 循环(通常称为 await for)像 for 循环一样迭代流的事件在一个 Iterable 上。例如:

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

此代码仅接收整数事件流中的每个事件,将它们相加,并返回总和(的未来)。当循环体结束时,函数会暂停,直到下一个事件到达或流完成。

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

于 2020-05-07T13:52:07.053 回答