Как вернуть список, после того как метод заполнит его, Трепещите

#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. Вы спасли мне день, спасибо за ваш ответ 🙂