根据文档,我对如何实现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的未来论点会怎样?还是完全不对?
答案 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) {
...
}
);
}
}