Как получить данные из Firestore в ограниченной модели — Flutter

#firebase #dart #flutter

#firebase #dart #flutter

Вопрос:

Я пытаюсь получить данные из Firestore, при отладочной печати future выполняет свою работу, и список получает данные, а в DebugPrint длина равна , но когда я пытаюсь получить данные в другом списке виджетов, получает null, в DebugPrint длина равна 0 .

model.dart

   class BBModel extends Model {
  int _counter = 10;

  int get counter => _counter;

  var db = dbBB;
  List<BB> _bbs;

  List<BB> get bbs => _bbs;

  Future<List<BB>> getBBs() async {
    var snapshot = await db.getDocuments();
    for (int i = 0; i < snapshot.documents.length; i  ) {
      _bbs.add(BB.fromSnapshot(snapshot.documents[i]));
      print(bbs.length.toString()); //recives 23
    }
    notifyListeners();
    return _bbs;
  }
}
  

main.dart

 void main() {
  var model = BBModel();

  model.getBBs();
  runApp(ScopedModel<BBModel>(model: BBModel(), child: MyApp()));
}
  

statefullpage.dart

 Expanded(
flex: 1,
child: Container(
height: 400.0,
child: ScopedModelDescendant<BBModel>(
builder: (context, child, model) {
return ListView.builder(
itemCount: model.bbs.length,
itemBuilder: (context, index) {
return Text(model.bbs[index].bbID);
  });
 }))),
  

Ответ №1:

Похоже, что код, который вы написали в main.dart, неверен. Созданная модель отличается от той, которую вы отправили в своей ScopedModel.

Исправление

Измените model: model на model: BBModel() в вашем файле main.dart.

 void main() {
  final model = BBModel();    

  model.getBBs();
  runApp(ScopedModel<BBModel>(model: model, child: MyApp()));
}
  

Ответ №2:

В main.dart я бы попытался выполнить:

 void main() {
  var model = BBModel();

  model.getBBs().then((someVariableName){
    runApp(ScopedModel<BBModel>(model: BBModel(), child: MyApp()));
  });
}
  

примечание: «someVariableName» будет содержать список< BB>

Ответ №3:

Для ожидания вы можете использовать

 await model.getBBs();
  

Однако, помимо этого, я не рекомендую загружать данные в main, так как это замедлит использование приложения, поскольку данных становится все больше. Загружайте данные только на нужные вам страницы и найдите способ сделать это.