Flutter: FutureBuilder NoSuchMethodError isNotEmpty

Я создал проект флаттера с FlutterBuilder с ListView.builder, который получает данные из файла JSON (локального). Я успешно создаю приложение, но всего на секунду экран выглядел так:

моя ошибка

после этого мое приложение работает без сбоев. Вот мой код:

FutureBuilder(
                future: _isInit ? fetchDoa(context) : Future(null),
                builder: (context, _) {
                  if (doaList.isNotEmpty) {
                    return ListView.builder(
                      itemCount: doaList.length,
                      itemBuilder: (BuildContext context, int index) {
                        Doa doa = doaList[index];
                        return Card(
                            margin: EdgeInsets.all(8),
                            child: ListTile(
                                title: Text(doa.judul),
                                onTap: () {
                                  Navigator.of(context).push(MaterialPageRoute(
                                      builder: (BuildContext context) =>
                                          DoaPage(
                                            doa: doa,
                                          )));
                                },
                                trailing: IconButton(
                                  icon: Icon(
                                    doa.fav
                                        ? Icons.favorite
                                        : Icons.favorite_border,
                                    color: doa.fav ? Colors.red : null,
                                  ),
                                  onPressed: () => setState(() {
                                    doa.fav = !doa.fav;
                                  }),
                                )));
                      },
                    );
                  }
                  return CircularProgressIndicator();
                })

Это полный предварительный просмотр моего приложения:

введите описание изображения здесь

Мне нужна ваша помощь, большое спасибо :)


person Bill Rei    schedule 17.04.2021    source источник
comment
если (doaList.isNotEmpty) становится пустым при первом   -  person Janvi Patel    schedule 17.04.2021
comment
@JanviPatel есть ли у вас какие-нибудь советы по поводу моего кода, чтобы исправить ошибку?   -  person Bill Rei    schedule 17.04.2021
comment
нужно проверить ваш код   -  person Janvi Patel    schedule 17.04.2021


Ответы (4)


Сделать строитель как

builder: (context, snapshot) {
 if(snapshot.hasData){
    if (doaList != null && doaList.isNotEmpty){
    // UI
    } else {
    // no data available
  }

 } else {
   // show loader or empty container
 }
person Priyesh    schedule 17.04.2021
comment
Спасибо, Приеш, за твой ответ. Мне это действительно помогает :) - person Bill Rei; 17.04.2021
comment
Продолжайте расти :), если работает то исправьте пожалуйста - person Priyesh; 17.04.2021

Измените это:

if (doaList.isNotEmpty)

в это:

if (doaList != null)
person ambiguous58    schedule 17.04.2021
comment
Лучше предложу. ИНИЦИАЛИЗИРУЙТЕ свой список. Сейчас мы идем в безопасное место. - person Problematic Dude; 17.04.2021
comment
вау, просто нужно изменить строку кода и успешно исправить: D Большое спасибо, мистер. двусмысленный :) - person Bill Rei; 17.04.2021

Это потому, что у вас есть нулевые данные в следующей строке:

if (doaList.isNotEmpty)

и ваш FutureBuilder немного неверен.

Вам нужно обновить свой FutureBuilder примерно так:

  // Change YourDoaList to your model.
  FutureBuilder<YourDoaList>(
    future: _isInit ? fetchDoa(context) : Future(null),
    builder: (BuildContext context, AsyncSnapshot<YourDoaList> snapshot) {
      Widget widget;
      if (snapshot.hasData) {
        // You have succesfully get the data.
        // check if you have correct data here
        YourDoaList items = snapshot.data;

        widget = ListView.builder(
           ...
        );
      } else if (snapshot.hasError) {
        // You've failed get the data
        widget = Text("Failed");
      } else {
        // waiting for data
        widget = CircularProgressIndicator();
      }

      return widget;
    },
  ),

См. Документацию здесь: https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html

person ישו אוהב אותך    schedule 17.04.2021
comment
Большое спасибо за ваш ответ. Теперь я лучше понимаю FutureBuilder :) - person Bill Rei; 17.04.2021

Хотя есть много хороших ответов. Но по вашему нынешнему коду. Просто добавьте {} туда, где вы определили свой список DAO.

Нравиться

var daoList = [];

И еще одна важная вещь из официальных документов. Ссылка

Будущее должно быть получено раньше, например во время State.initState, State.didUpdateWidget или State.didChangeDependencies. Его нельзя создавать во время вызова методов State.build или StatelessWidget.build при создании FutureBuilder. Если будущее создается одновременно с FutureBuilder, то каждый раз, когда родительский объект FutureBuilder перестраивается, асинхронная задача будет перезапущена.

Итак, в вашем initState сделайте

@override
  void initState() {
    myFuture = getFuture();
    super.initState();
  }

а затем в futureBuilder.

FutureBuilder(
    future: myFuture,
    remaining code
........
                
person Problematic Dude    schedule 17.04.2021