Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 异步函数中的异步操作_Firebase_Flutter_Asynchronous_Dart_Async Await - Fatal编程技术网

Firebase 异步函数中的异步操作

Firebase 异步函数中的异步操作,firebase,flutter,asynchronous,dart,async-await,Firebase,Flutter,Asynchronous,Dart,Async Await,例如,假设我在initState中调用一个函数,该函数从Firebase集合中获取一些文档。我正在使用async forEach对这些文档进行迭代,需要执行等待操作,从firebase的另一个集合中获取一些数据,并将它们保存在列表中,然后在forEach完成后返回。但是当第二个等待函数在return语句之后完成时,返回的列表是空的。我该怎么处理?我很难理解异步编程,因此请详细解释,我们将不胜感激 这里的代码只是一个显示实际场景的示例代码 Future getList() async {

例如,假设我在initState中调用一个函数,该函数从Firebase集合中获取一些文档。我正在使用async forEach对这些文档进行迭代,需要执行等待操作,从firebase的另一个集合中获取一些数据,并将它们保存在列表中,然后在forEach完成后返回。但是当第二个等待函数在return语句之后完成时,返回的列表是空的。我该怎么处理?我很难理解异步编程,因此请详细解释,我们将不胜感激

这里的代码只是一个显示实际场景的示例代码

Future getList() async {

    //These are just example refs and in the actual refs it does print actual values
    var collectionOneRef = Firestore.instance.collection('Collection1');
    var collectionTwoRef = Firestore.instance.collection('Collection2');
    List<Map<String, dynamic>> properties = [];

    QuerySnapshot querySnapshot = await collectionOneRef
        .getDocuments()
        .then((query) {
      query.documents.forEach((colOneDoc) async {
        var colOneID = colOneDoc.documentID;
        await collectionTwoRef.document(colOneID).get().then((colTwoDoc) {
          Map<String, dynamic> someMap = {
            "field1": colTwoDoc['field1'],
            "field2": colTwoDoc['field2']
          };
          
          properties.add(someMap);

          properties.sort((p1, p2) {

            //sorting based on two properties
            var r = p1["field1"].compareTo(p2["field1"]);
            if (r != 0) return r;
            return p1["field2"].compareTo(p2["field2"]);
          });

          print(properties); //this prints actual data in it

         ));
        });
      });
    });

    print(properties); //This prints a blank list as [] and obviously returns blank list 

    return properties; 
  }
Future getList()异步{
//这些只是示例参考,在实际参考中,它会打印实际值
var collectionOneRef=Firestore.instance.collection('Collection1');
var collectionTwoRef=Firestore.instance.collection('Collection2');
列表属性=[];
QuerySnapshot QuerySnapshot=等待收集能量ef
.getDocuments()
.然后((查询){
query.documents.forEach((colOneDoc)异步{
var colOneID=colOneDoc.documentID;
等待collectionTwoRef.document(colOneID.get()。然后((colTwoDoc){
映射someMap={
“field1”:colTwoDoc['field1'],
“field2”:colTwoDoc['field2']
};
添加(someMap);
properties.sort((p1,p2){
//基于两个属性的排序
变量r=p1[“字段1”]。与(p2[“字段1”])相比;
如果(r!=0)返回r;
返回p1[“field2”]。与(p2[“field2”])进行比较;
});
打印(属性);//这将打印其中的实际数据
));
});
});
});
print(properties);//将空白列表打印为[],并明显返回空白列表
归还财产;
}

现在,当我在有状态小部件的initState中调用这个函数并在某处显示它时,它会显示一个空白列表。但是,在我“热重新加载”之后,它会显示出来。我想获取数据并显示它,而不需要重新加载数据。提前感谢

听起来您需要在调用
getList()
的代码块中等待整个函数本身


您正在异步并在函数内部等待,这看起来很好,这就是为什么在热重新加载时会得到结果。但在这种情况下,您可能没有在调用此函数的代码中真正等待整个函数本身。请检查。

听起来您需要在调用
getList()
的代码块中等待整个函数本身


您正在异步并在函数内部等待,这看起来很好,这就是为什么在热重新加载时会得到结果。但在这种情况下,您可能没有在调用此函数的代码中真正等待整个函数本身。请检查。

请添加一些代码。这听起来像是foreach循环的问题,而不是异步await@SweetChillyPhilly补充。。请看一下:)请添加一些代码。这听起来像是foreach循环的问题,而不是异步await@SweetChillyPhilly补充。。请看一看:)我正在initState中调用此函数,正如我提到的,我不应该等待它,这也不是一个好的做法。我认为这就是你的问题所在,请尝试使用生命周期挂钩。这可能会有所帮助。我还需要在构建方法中显示此列表。根据许多SOF专家的说法,异步或等待构建方法不是一个好的实践。我唯一能称之为这个的地方是initState,在那里它不应该被等待。如果我在这些陈述中有任何错误,请纠正我。谢谢我不认为你必须让它处于initstate状态,为什么你不能在他们访问你的页面时获取你的数据,并让它在BeforeMounted()函数中运行,这样它就会在加载页面之前开始处理,然后你会在它等待时显示一个加载图标。商店最好会发送此事件。这些是我的想法这里的代码是dart代码颤振框架。我认为您提到的BeforeMounted()来自Javascript。。Dart/Flutter中是否存在类似的情况?我在initState中调用此函数,正如我所提到的,我不应该等待它,这也不是一个好的实践。我相信这就是你的问题所在,请尝试使用生命周期挂钩。这可能会有所帮助。我还需要在构建方法中显示此列表。根据许多SOF专家的说法,异步或等待构建方法不是一个好的实践。我唯一能称之为这个的地方是initState,在那里它不应该被等待。如果我在这些陈述中有任何错误,请纠正我。谢谢我不认为你必须让它处于initstate状态,为什么你不能在他们访问你的页面时获取你的数据,并让它在BeforeMounted()函数中运行,这样它就会在加载页面之前开始处理,然后你会在它等待时显示一个加载图标。商店最好会发送此事件。这些是我的想法这里的代码是dart代码颤振框架。我认为您提到的BeforeMounted()来自Javascript。。在飞镖/颤振中有类似的东西吗?