【问题标题】:How to implement FutureBuilder with already obtained future如何用已经获得的未来实现 FutureBuilder
【发布时间】:2023-04-01 08:20:01
【问题描述】:

我对如何根据文档实现 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 的父级时, 异步任务将重新启动。

这就是我的问题的来源,我明白这些话在说什么,但就根据它编写代码而言,究竟是什么意思/看起来像什么?

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

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

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

在这种情况下,FutureBuilder 的未来参数会发生什么?或者这完全不对?

【问题讨论】:

标签: flutter dart


【解决方案1】:

是的,你在正确的轨道上。处理这个问题的最简单方法是在你的状态中存储一个 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) {
        ...
      }
    );
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    相关资源
    最近更新 更多