通过MaterialPageRoute进行路由时,Flutter Page的数据未加载,但是热重加载是否正确加载了数据?

时间:2020-08-04 02:05:34

标签: flutter dart mobile routes

我正在构建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()));会在页面加载时被调用?

3 个答案:

答案 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
}