首页 > 解决方案 > FutureBuilder 仅适用于 Debug

问题描述

我有一个带有 ListView 的 FutureBuilder 来显示具有从 .txt 文件中读取的值的自定义项(小部件)。

问题是这些项目只有在我以调试模式或运行模式启动应用程序时才会显示。当我尝试使用 AppLauncher 打开应用程序时(就像“普通”用户那样),listView 是空的。我在 AVD 和“真实”设备上试过这个。

Future "listFuture" 用于从文件中读取值并返回 Widgets 列表

class Home extends StatefulWidget {
  final Future listFuture = setupList();

  @protected
  @mustCallSuper
  void initState() {
    print("init complete");
  }

  @override
  State<StatefulWidget> createState() {
    return HomeState();
  }
}

如果 FutureBuilder 正确获取数据,则应显示带有我的小部件列表的 listView

child: FutureBuilder<List<SubListItem>>(
                      future: widget.listFuture,
                      // ignore: missing_return
                      builder: (BuildContext context, AsyncSnapshot snapshot) {
                        switch (snapshot.connectionState) {
                          case ConnectionState.none:
                            return new Text("None");
                          case ConnectionState.waiting:
                            return new Text("loading");
                          default:
                            if (snapshot.hasError) {
                              print("Error");
                              return Center(child: (Text("No data")));
                            } else {
                              return subListView(context, snapshot);
                            }
                        }
                      },
                    ),
Widget subListView(BuildContext context, AsyncSnapshot snapshot) {
  List<Widget> items = snapshot.data;

  //This ScrollConfiguration is used to remove any animations while scrolling
  return ScrollConfiguration(
    behavior: CustomScrollBehavior(),
    child: Container(
      padding: EdgeInsets.symmetric(horizontal: 4),
      child: new ListView.builder(
        itemCount: items.length,
        itemBuilder: (BuildContext context, int index) {
          return Column(
            children: <Widget>[items[index]],
          );
        },
      ),
    ),
  );
}

感谢您的帮助!

标签: flutterdart

解决方案


它看起来像一个异步数据问题,请尝试以下更改:

  • listFuture您的StatefulWidget.
  • listFuture你的State.
  • setupList()方法移动到您的State.
  • 最后像这样直接调用:
child: FutureBuilder<List<SubListItem>>(
                      future: setupList(),
                      // ignore: missing_return
                      builder: (BuildContext context, AsyncSnapshot snapshot) {
                           if(!snapshot.hasData) {

                            return new Text("loading");
                           }
                           else  if (snapshot.hasError) {
                              print("Error");
                              return Center(child: (Text("No data")));
                            } else {
                              return subListView(context, snapshot);
                            }
                        }
                      },
                    ),

推荐阅读