首页 > 解决方案 > 小部件是在应该使用之前创建的 => 导致错误

问题描述

我有一个带有 futurebuilder 的自定义小部件,我想用它来加载一些数据。

这是它的样子:

class LoadOverlay extends StatefulWidget {
  Widget child;
  LoadOverlay({Key key, this.child}) : super(key: key);

  @override
  _LoadOverlayState createState() => _LoadOverlayState();
}

class _LoadOverlayState extends State<LoadOverlay> {
  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
        future: Catalog.catalog.loadAsset(), //Here the csvString gets loaded
        builder: (BuildContext context, AsyncSnapshot snapshot) {
          if (snapshot.hasData)
            return widget.child;
          else {
            return Scaffold(
              body: Center(
                child: CircularProgressIndicator(), //Tells the user that something is loading
              ),
            );
          }
        }
    );
  }
}

这就是我使用它的方式:

class _HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return LoadOverlay(
        child: Scaffold(
          body: Center(
            child: Text(Catalog.catalog.csvString), //This gets created to early
        ),
      )
    );
  }
}

问题是Text(Catalog.catalog.csvString)在 futurebuilder 执行之前被加载,因为 csvString 还没有完成我得到一个空错误。如果我像这样将它放入LoadOverlay

if (snapshot.hasData)
    Text(Catalog.catalog.csvString)

它之所以有效,是因为代码仅在快照有数据后才执行。

那么我如何将一个小部件传递给 FutureBuilder,在执行未来之后调用和绘制它

标签: flutter

解决方案


你可以传递一个空的Stringwhile csvStringis still null

child: Text(Catalog.catalog.csvString ?? ''),

或者

初始化时String分配一个空。csvString

String csvString = '';

推荐阅读