首页 > 解决方案 > 方法填充后如何返回列表,颤振

问题描述

我遇到了一个问题,我想知道你是否可以帮助我。

我有一个返回项目列表的函数(在 Flutter 中)。现在这个项目列表应该由另一个函数填充,该函数认为我的数据库并收集正确的项目。我的问题是,我的函数在返回语句之后运行......这是一些代码:

Future<List<MaterialItem>> getItems(String path, String fach) async {


// This is a empty List that I want to fill
List<MaterialItem> list = [];

// That's my Function, that fills the List
var result = await _db
    .collection("$path/$fach/")
    .get()
    .then((QuerySnapshot querySnapshot) {
  querySnapshot.docs.forEach((doc) {
    
    // Here the List gets filled
    list.add(MaterialItem.fromSnapshot(doc.data() as Map<String, dynamic>));
  });
});

// Here the List should be returned, but after my Function fills it.
return list;


}

希望你知道我的问题是什么,有人可以帮助我。

标签: flutter

解决方案


我认为您可以使用Completer. 您的函数应该返回 的 Future 属性,Completer然后数据库调用应该完成它。

看一下 API 和示例: https ://api.dart.dev/stable/2.12.4/dart-async/Completer-class.html

例如:(伪代码)

Future<List<MaterialItem>> getItems(String path, String fach) async {
  
  // declare a completer
  Completer<List<MaterialItem>> completer = Completer();
  List<MaterialItem> list = [];
  final result = await _db
      .collection("$path/$fach/")
      .get()
      .then((QuerySnapshot querySnapshot) {
    querySnapshot.docs.forEach((doc) {
      
      list.add(MaterialItem.fromSnapshot(doc.data() as Map<String, dynamic>));
    });
    
    // let the database call complete the completer
    completer.complete(list);
  });

  // return the future value of the completer
  return completer.future;
}

推荐阅读