Flutter Navigator 在异步函数中的使用问题
Flutter Navigator use in async function issue
我正在编写一个应用程序,其中登录屏幕要求用户提供各种权限并使用 Facebook 登录。
请求完所有权限后,应用会移至下一个屏幕以询问更多信息,然后 return 转到调用屏幕以完成其任务。
似乎 Navigator.push 在异步函数中没有按预期工作。
void function() async {
<...do something 1...>
Navigator.pushNamed(context, screenName);
<...do something 2...>
}
预期行为
将是 <...do something 1...>
将 运行,然后 Navigator 将调用下一个屏幕,一旦 Navigator.pop(context);
被第二个屏幕调用,应用程序将 return 到第一个屏幕并且执行<...do something 2...>
。这是它在应用程序的所有其他屏幕上的工作方式。
实际行为
<...do something 1...>
被调用,然后 <...do something 2...>
然后 在某个时候 导航器被触发。
这导致我不得不做各种尝试来阻止应用程序通过它的流程,但这似乎是非常奇怪的行为。
有没有其他人遇到过这种情况,或者可以给我解决方法?这甚至不涉及函数的 await
部分,说它让我发疯有点轻描淡写。
非常感谢任何帮助!
你可以使用 .then() 函数来实现你想要的,例如,
(使用电子邮件和密码登录。)
onPressed: () {
authHandler.handleSignInEmail(emailController.text, passwordController.text)
.then((FirebaseUser user) {
Navigator.push(context, new MaterialPageRoute(builder: (context) => new HomePage()));
}).catchError((e) => print(e));
}
我相信Navigator.pushNamed
returns一个Future
。因此,也许如果您只是像这样添加 await
:
void function() async {
<...do something 1...>
await Navigator.pushNamed(context, screenName);
<...do something 2...>
}
可以解决问题,虽然我没试过
我正在编写一个应用程序,其中登录屏幕要求用户提供各种权限并使用 Facebook 登录。
请求完所有权限后,应用会移至下一个屏幕以询问更多信息,然后 return 转到调用屏幕以完成其任务。
似乎 Navigator.push 在异步函数中没有按预期工作。
void function() async {
<...do something 1...>
Navigator.pushNamed(context, screenName);
<...do something 2...>
}
预期行为
将是 <...do something 1...>
将 运行,然后 Navigator 将调用下一个屏幕,一旦 Navigator.pop(context);
被第二个屏幕调用,应用程序将 return 到第一个屏幕并且执行<...do something 2...>
。这是它在应用程序的所有其他屏幕上的工作方式。
实际行为
<...do something 1...>
被调用,然后 <...do something 2...>
然后 在某个时候 导航器被触发。
这导致我不得不做各种尝试来阻止应用程序通过它的流程,但这似乎是非常奇怪的行为。
有没有其他人遇到过这种情况,或者可以给我解决方法?这甚至不涉及函数的 await
部分,说它让我发疯有点轻描淡写。
非常感谢任何帮助!
你可以使用 .then() 函数来实现你想要的,例如, (使用电子邮件和密码登录。)
onPressed: () {
authHandler.handleSignInEmail(emailController.text, passwordController.text)
.then((FirebaseUser user) {
Navigator.push(context, new MaterialPageRoute(builder: (context) => new HomePage()));
}).catchError((e) => print(e));
}
我相信Navigator.pushNamed
returns一个Future
。因此,也许如果您只是像这样添加 await
:
void function() async {
<...do something 1...>
await Navigator.pushNamed(context, screenName);
<...do something 2...>
}
可以解决问题,虽然我没试过