我正在构建Flutter应用,并且有一个页面,其中包含一个填充有数据的表。我这样加载数据:
union
(
union app("ai1").requests, app("ai1").dependencies
| where operation_Id == "eec42c35781a8e4199c420b8fda7bf87"
),
(
union app("ai2").requests, app("ai2").dependencies
| where operation_Id == "eec42c35781a8e4199c420b8fda7bf87"
),
(
union app("ai3").requests, app("ai3").dependencies
| where operation_Id == "eec42c35781a8e4199c420b8fda7bf87"
)
当热重新加载页面时,此方法可以正常工作,但是当我通过MaterialPageRoute路由到此页面时,
像这样:class _AccountMenuState extends State<AccountMenu> { {
List<Account> accounts;
Future<List<Account>> getAccounts() async {
final response = await http.get('http://localhost:5000/accounts/' + globals.userId);
return jsonDecode(response);
}
setAccounts() async {
accounts = await getAccounts();
}
@override
void initState() {
setAccounts();
super.initState();
}
}
然后数据不存在。
我想念什么?我以为Navigator.push(context, MaterialPageRoute(builder: (context) => AccountMenu()));
会在页面加载时被调用?
答案 0 :(得分:1)
initState()不会等待setAccounts()完成执行。在方法setAccounts()中,加载数据后调用setState。
setAccounts() async {
accounts = await getAccounts();
setState((){});
}
答案 1 :(得分:1)
您不能直接在setState
内进行initState
,但是可以将初始化包装在PostFrameCallback
中,以确保initState
的{{1}}生命周期是完成。
Widget
答案 2 :(得分:0)
initState不等待。它仅在小部件生成器之前加载函数,但不会等待。 您需要等待向小部件加载数据,直到accounts.length不为空。 在数据仍然加载或使用FutureBuilder时显示加载窗口小部件
List<Account> accounts;
@override
void initState() {
setAccounts();
super.initState();
}
@override
Widget build(BuildContext context) {
accounts.length > 0 ? SHOW_DATA_HERE : LOADING_WIDGET_HERE
}