如何在已获得的未来中实现FutureBuilder

时间:2019-11-20 00:29:19

标签: flutter dart

根据文档,我对如何实现Flutter的FutureBuilder感到有些困惑。我这里有一个可以运行的Future Builder,唯一的问题是每次运行build方法时都会使用Future:

FutureBuilder(
    future: DBProvider.db.getUser(),
    builder: (_, userData) {
        switch (userData.connectionState) {
            case ConnectionState.none:
                return Container();
            case ConnectionState.waiting:
                return Container();
            case ConnectionState.active:
            case ConnectionState.done:
                newUser = userData.data;
                return ListView(
                    shrinkWrap: true,
                    children: <Widget>[
                        ... // Lot's of things
                    ],
                );
        }
        return null;
    },
),

然后我意识到文档的这一部分的重要性,因为它说未来必须“早日获得”,这样就不会发生此问题:

  

将来一定要早一些,例如中   State.initState,State.didUpdateConfig或   State.didChangeDependencies。不得在   构造状态时调用State.build或StatelessWidget.build方法   FutureBuilder。如果未来与   FutureBuilder,那么每次重新构建FutureBuilder的父项时,   异步任务将重新启动。

这是我的问题的出处,我理解这些词在说什么,但是根据代码的确切含​​义/外观来写代码?

我是否只是简单地创建一个函数并像这样在initState中调用它?

@override
void initState() {
    super.initState();
    _getUser();
}

_getUser() async {
    newUser = await DBProvider.db.getUser();
}

在这种情况下,FutureBuilder的未来论点会怎样?还是完全不对?

1 个答案:

答案 0 :(得分:2)

是的,您在正确的轨道上。解决此问题的最简单方法是在状态中存储Future变量。在initState中进行API调用并存储Future。然后,您可以将此Future传递给FutureBuilder。

类似这样的东西:

class MyWidget extends StatefulWidget {
  State createState() {
    return MyState();
  }
}

class MyState extends State<MyWidget> {
  Future userFuture;
  void initState() {
    super.initState();
    // Note here we are not awaiting the user, but rather storing
    // the future in the variable
    userFuture = DBProvider.db.getUser();
  }

  Widget build(BuildContext context) {
    return FutureBuilder(
      future: userFuture,
      builder: (BuildContext, snapshot) {
        ...
      }
    );
  }
}