颤振:FutureBuilder NoSuchMethodError isNotEmpty

时间:2021-04-17 05:35:20

标签: flutter dart flutter-futurebuilder

我使用 FlutterBuilder 和 ListView.builder 创建了一个 Flutter 项目,它从 JSON 文件(本地)获取数据。我成功地构建了应用程序,但只是一秒钟的屏幕显示如下:

my error

在那之后,我的应用程序运行顺利。 这是我的代码:

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();
                })

这是我的应用程序的完整预览:

enter image description here

我需要你的帮助,非常感谢:)

4 个答案:

答案 0 :(得分:1)

改变这个:

if (doaList.isNotEmpty)

进入这个:

if (doaList != null)

答案 1 :(得分:1)

这是因为您在以下行中有一个空数据:

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

答案 2 :(得分:1)

将构建器设为

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

 } else {
   // show loader or empty container
 }

答案 3 :(得分:1)

虽然有很多好的答案。但是按照你现在的代码。只需在您定义 DAO 列表的位置添加 {}

喜欢

var daoList = [];

官方文档中的一件重要事情Link

<块引用>

future 一定是更早获得的,例如在 State.initState、State.didUpdateWidget 或 State.didChangeDependencies 期间。在构造 FutureBuilder 时,它不能在 State.build 或 StatelessWidget.build 方法调用期间创建。如果future和FutureBuilder同时创建,那么每次重建FutureBuilder的parent时,异步任务都会重新启动。

所以在你的 initState 中,做

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

然后在 futureBuilder 中。

FutureBuilder(
    future: myFuture,
    remaining code
........