Flutter 如何在颤振中实现异步/等待

Flutter 如何在颤振中实现异步/等待,flutter,Flutter,我有这个函数,它执行一些firestore操作并检索数据 但问题是它返回一个空值。我找到的原因是,它在获取数据之前返回值,它不会等到检索到数据时才返回值 这是我的密码。我已经打印了一些print语句来检查执行顺序 getNewsOnSearchBar() { final String _collection = 'news'; final Firestore _fireStore = Firestore.instance; var newsList = []; print("

我有这个函数,它执行一些
firestore
操作并检索数据

但问题是它返回一个空值。我找到的原因是,它在获取数据之前返回值,它不会等到检索到数据时才返回值

这是我的密码。我已经打印了一些
print
语句来检查执行顺序


getNewsOnSearchBar() {
  final String _collection = 'news';
  final Firestore _fireStore = Firestore.instance;
  var newsList = [];

  print("1");
  getData() async {
    print("2");
    return await _fireStore.collection(_collection).getDocuments();
  }

  getData().then((val) async{
    if (val.documents.length > 0) {
      print("3");
      for (int i = 0; i < val.documents.length; i++) {        
        newsList.add(await val.documents[i].data["headline"]);
      }
    } else {
      print("Not Found");
    }
  });

  print("4");

  return ok;
}
我需要的输出是:

I/flutter (17145): 1
I/flutter (17145): 2
I/flutter (17145): 3
I/flutter (17145): 4

有人能帮我吗?

如果您想像您的情况一样等待来自
未来的值,请不要使用
,然后使用
等待

Future<int> myFunc() {
  return Future.delayed(Duration(seconds: 1), () => 0);
}

void main() async {
  final int result = await myFunc();
  print(result);//0
}
Future myFunc(){
返回Future.delayed(持续时间(秒数:1),()=>0);
}
void main()异步{
最终int结果=等待myFunc();
打印(结果);//0
}
在您的情况下,您希望执行类似的操作(您可以根据需要进行更改):

getNewsOnSearchBar()异步{
最后一个字符串_collection='news';
最终Firestore _Firestore=Firestore.instance;
var newsList=[];
印刷品(“1”);
getData()异步{
印刷品(“2”);
return wait_fireStore.collection(_collection.getDocuments();
}
final ref=等待获取数据();
如果(参考文件长度>0){
印刷品(“3”);
对于(int i=0;i
当您想像您的情况一样等待来自
未来的值时,不要使用
然后
,使用
等待

Future<int> myFunc() {
  return Future.delayed(Duration(seconds: 1), () => 0);
}

void main() async {
  final int result = await myFunc();
  print(result);//0
}
Future myFunc(){
返回Future.delayed(持续时间(秒数:1),()=>0);
}
void main()异步{
最终int结果=等待myFunc();
打印(结果);//0
}
在您的情况下,您希望执行类似的操作(您可以根据需要进行更改):

getNewsOnSearchBar()异步{
最后一个字符串_collection='news';
最终Firestore _Firestore=Firestore.instance;
var newsList=[];
印刷品(“1”);
getData()异步{
印刷品(“2”);
return wait_fireStore.collection(_collection.getDocuments();
}
final ref=等待获取数据();
如果(参考文件长度>0){
印刷品(“3”);
对于(int i=0;i
您可以使用wait来代替使用,这将解决您的问题。 下面是代码在更改后的外观,我强烈建议您指定函数将返回的数据类型

getNewsOnSearchBar() async {
    final String _collection = 'news';
    final Firestore _fireStore = Firestore.instance;
    var newsList = [];

    print("1");

    Future<QuerySnapshot> getData() async {
        print("2");
        return await _fireStore.collection(_collection).getDocuments();
    }

    QuerySnapshot val = await getData();
    if (val.documents.length > 0) {
        print("3");
        for (int i = 0; i < val.documents.length; i++) {        
           newsList.add(val.documents[i].data["headline"]);
        }
    } else {
       print("Not Found");
    }
    print("4");
    return ok;
}
getNewsOnSearchBar()异步{
最后一个字符串_collection='news';
最终Firestore _Firestore=Firestore.instance;
var newsList=[];
印刷品(“1”);
Future getData()异步{
印刷品(“2”);
return wait_fireStore.collection(_collection.getDocuments();
}
QuerySnapshot val=等待获取数据();
如果(val.documents.length>0){
印刷品(“3”);
对于(int i=0;i
您可以使用wait来代替使用,这将解决您的问题。 下面是代码在更改后的外观,我强烈建议您指定函数将返回的数据类型

getNewsOnSearchBar() async {
    final String _collection = 'news';
    final Firestore _fireStore = Firestore.instance;
    var newsList = [];

    print("1");

    Future<QuerySnapshot> getData() async {
        print("2");
        return await _fireStore.collection(_collection).getDocuments();
    }

    QuerySnapshot val = await getData();
    if (val.documents.length > 0) {
        print("3");
        for (int i = 0; i < val.documents.length; i++) {        
           newsList.add(val.documents[i].data["headline"]);
        }
    } else {
       print("Not Found");
    }
    print("4");
    return ok;
}
getNewsOnSearchBar()异步{
最后一个字符串_collection='news';
最终Firestore _Firestore=Firestore.instance;
var newsList=[];
印刷品(“1”);
Future getData()异步{
印刷品(“2”);
return wait_fireStore.collection(_collection.getDocuments();
}
QuerySnapshot val=等待获取数据();
如果(val.documents.length>0){
印刷品(“3”);
对于(int i=0;i
您的for循环给出了问题,您在async中使用了for循环,然后在for循环中使用了wait。您的for循环给出了问题,您在async中使用了for循环,然后在for循环中使用了wait。我得到这个错误:
Future'不是“List”类型的子类型。
好的,它可以工作,但是如何返回
newsList
,并将其放入变量
var list=[]
。当我尝试此操作时,会出现错误,
类型“Future”不是类型“List”的子类型。
您能否再次共享您当前使用的代码?我检查了我在firebase集合中注释的代码,它似乎工作正常。这就是我正在使用的代码<代码>最终字符串_collection='news';最终Firestore _Firestore=Firestore.instance;var newsList=[];印刷品(“1”);Future getData()异步{print(“2”);返回wait _fireStore.collection(_collection).getDocuments();}QuerySnapshot val=wait getData();如果(val.documents.length>0){print(“3”);对于(int i=0;i
您必须使用wait或然后执行与var list=wait getNewsOnSearchBar()相同的操作,我得到以下错误:
Future'不是'list'类型的子类型
好的,它可以工作,但我如何返回
newsList
并将其获取到变量
var list=[]
。当我尝试此操作时,会出现错误,
类型“Future”不是类型“List”的子类型。
您能否再次共享您当前使用的代码?我检查了我在firebase集合中注释的代码,它似乎工作正常。这就是我正在使用的代码<代码>最终字符串_collection='news';最终Firestore _Firestore=Firestore.instance;var newsList=[];印刷品(“1”);Future getData()异步{print(“2”);