【问题标题】:Flutter Navigator use in async function issueFlutter Navigator 在异步函数问题中的使用
【发布时间】:2020-11-29 10:55:06
【问题描述】:

我正在编写一个应用程序,其中登录屏幕要求用户提供各种权限并使用 Facebook 登录。

在请求所有权限后,应用程序会移至下一个屏幕以询问更多信息,然后返回调用屏幕以完成其任务。

然而,Navigator.push 在异步函数中似乎无法正常工作。

void function() async {
<...do something 1...>
Navigator.pushNamed(context, screenName);
<...do something 2...>
}

预期行为 将是&lt;...do something 1...&gt; 将运行,然后Navigator 将调用下一个屏幕,一旦Navigator.pop(context); 被第二个屏幕调用,应用程序将返回到第一个屏幕并执行&lt;...do something 2...&gt;。这就是它在应用程序中所有其他屏幕上的工作方式。

实际行为 调用&lt;...do something 1...&gt;,然后调用&lt;...do something 2...&gt;,然后在某个时候导航器被触发。

这导致我不得不做各种尝试阻止应用程序通过它的流程,但这似乎是非常奇怪的行为。

有没有其他人经历过这种情况,或者可以给我一个解决方法?这甚至不涉及函数的await 部分,说它让我发疯有点轻描淡写。

非常感谢任何帮助!

【问题讨论】:

    标签: flutter flutter-navigation


    【解决方案1】:

    我相信Navigator.pushNamed 返回一个Future。因此,也许如果您像这样添加await

    void function() async {
    <...do something 1...>
    await Navigator.pushNamed(context, screenName);
    <...do something 2...>
    }
    

    它可以解决问题,虽然我没有尝试过。

    【讨论】:

      【解决方案2】:

      您可以使用 .then() 函数来实现您想要的,例如, (使用电子邮件和密码登录。)

      onPressed: () {
          authHandler.handleSignInEmail(emailController.text, passwordController.text)
          .then((FirebaseUser user) {
               Navigator.push(context, new MaterialPageRoute(builder: (context) => new HomePage()));
         }).catchError((e) => print(e));
      } 
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 2019-04-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多