#flutter
Вопрос:
У меня возникла проблема, и я подумал, не могли бы вы мне помочь.
У меня есть функция (во флаттере), которая возвращает список элементов. Теперь этот список элементов должен быть заполнен другой функцией, которая идет в мою базу данных и собирает правильные элементы. Моя проблема в том, что моя функция запускается после инструкции Return… Вот какой-то код:
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;
}
Надеюсь, вы знаете, в чем моя проблема, и кто-нибудь может мне помочь.
Ответ №1:
Я думаю, что вы могли бы решить эту проблему с помощью Completer
. Ваша функция должна возвращать будущее свойство 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;
}
Комментарии:
1. Как бы вы это реализовали?
2. Я добавил пример.
3. Вы спасли мне день, спасибо за ваш ответ 🙂