
[英]How to navigate to a different page using MenuItem in Flutter?
[英]Asynchronously navigate to a different page
我编写了一个需要身份验证的应用程序。 我还在设备上安全地保存了持久身份验证数据,因此每次应用程序启动时都不需要手动登录。
应用程序一启动,它就会自动路由到主路由(在我的例子中,这是一个无状态的闪屏)。 执行以下代码:
@override
Widget build(BuildContext context) {
ifLoggedIn(context);
return Scaffold(
body: Center(
child: Image.asset("assets/logo-sm.png", width: 200,),
),
);
}
void ifLoggedIn(context) async {
if (User.user != null) { // in case of a hot reload resetting the damn app
Navigator.of(context).push(right(PublicStart()));
} else {
User user = await User.loginFromSafeStorage(context); // login from safe storage
if (user != null)
Navigator.of(context).push(right(PublicStart()));
else // nope, no credentials found, redirect to the start-screen
Navigator.of(context).push(up(SignInScreen()));
}
}
ifLoggedIn(context)
function 是一个异步的 function 检查登录数据是否已经存储在本地。 如果是这种情况,它将对用户进行身份验证。
这个过程如下:
Case: Logindata found -> Login user and navigate to the start-screen
Case: No logindata found -> Navigate to the sign-in-screen.
如您所见,由于这个 function 是异步的,因此返回下面的Scaffold
并且该无状态小部件的构建过程不会中断。 但...
显然,在构建此小部件期间调用了 setState。 我不知道如何或为什么,但它似乎发生了。 我已经尝试解决这个问题,但这不是第一次发生,我有一种不好的感觉,我在开发这个应用程序时应用了不好的做法。
我怀疑这与检查登录用户有关。
我在随机时间得到很多(我的意思是,真的很多)的另一个错误如下: Unhandled Exception: 'package:flutter/src/widgets/navigator.dart': Failed assertion: line <insert number> pos <insert number>: ':_debugLocked'. is not true.
Unhandled Exception: 'package:flutter/src/widgets/navigator.dart': Failed assertion: line <insert number> pos <insert number>: ':_debugLocked'. is not true.
数字不时变化。 据我了解,这是为了防止路由被多次调用或破坏与路由有关的任何事情。 由于我随机收到此错误,因此这一定与异步函数有关。
最后确定我的问题:我在这里做错了什么以及执行上述操作的规范是什么?
编辑(更多说明):
异步调用不能从 build 方法中触发,因为它(build 方法)可以由于不同的原因被调用很多次,所以你不希望你的代码执行多次,因为这会导致不想要的结果
解决方案是使用有状态小部件并执行必须运行一次的代码(在您的情况下是检查身份验证状态的代码)(最好从initState()
)
也看看这个答案
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.