FutureBuilder仅适用于Debug

时间:2019-08-03 23:25:51

标签: flutter dart

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

问题在于这些项目仅在我以调试模式或运行模式启动应用程序时显示。当我尝试使用AppLauncher打开应用程序时(就像“普通”用户那样做),listView为空。我在AVD和“真实”设备上进行了尝试。

将来的“ listFuture”用于从文件中读取值并返回小部件列表

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]],
          );
        },
      ),
    ),
  );
}

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

似乎是异步数据问题,请尝试以下更改:

  • 从您的var obj = { HTTP_Index: p_Index }; var objJSON = JSON.stringify(obj); sessionStorage.setItem(objJSON); 中删除listFuture
  • StatefulWidget内添加listFuture变量。
  • State内移动setupList()方法。
  • 最后直接像这样调用:
State

答案 1 :(得分:0)

好,我解决了这个问题。构建窗口小部件时,只需调用“ setState”即可。

  @protected
  @mustCallSuper
  void initState() {
    super.initState();
    Future.delayed(Duration.zero, () {
      //This setState is necessary because it refreshes the listView
      setState(() {});
    });
  }