【问题标题】:How can I call an async method in StatelessWidget.build method?如何在 StatelessWidget.build 方法中调用异步方法?
【发布时间】:2020-05-02 11:28:19
【问题描述】:

我在颤振中有以下代码。在initialRoute: 属性中,它需要调用isLoggedIn() 方法,这是一个异步函数。我收到一条错误消息,提示我需要在 async 函数中调用 await。但是build 方法被其父类覆盖,而不是async 方法。如何在被覆盖的方法中调用 await

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      initialRoute: await isLoggedIn() ? '/': '/login',
      routes: <String, WidgetBuilder>{
        '/': (BuildContext context) {
          return MyHomePage(title: 'Home Page');
        },
        '/login': (BuildContext context) {
          return Login();
        },
      }

    );
  }
}

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    在我看来,做你想做的事是不可能的。

    正如您提到的 isLoggedIn 是异步的,这需要时间来计算,同时构建方法完成构建。您可以使用 futureBuilder 在无状态小部件中执行异步任务,但由于这是您的初始路线,您必须提供它,所以它再次不起作用。

    我建议您添加启动屏幕,您可以在其中计算平均调用该方法并找出导航。

    【讨论】:

      【解决方案2】:

      我建议创建一个身份验证路由器小部件来处理应用程序的登录状态是一个更好的选择,这样如果用户退出应用程序,导航可以自动更改。即:

      initialRoute: '/user-auth'
      

      然后是一个 UserAuth 小部件,您可以运行您的登录逻辑。

      【讨论】:

        【解决方案3】:

        当我遇到这个问题时,我通过将 await 不在 MyApp.build 中,而是在 main 中的 MyApp 调用中解决了它。像这样:

        Future <Widget> selectStartPage () async {
            return await isLoggedIn() ? HomePage (): Login (),
        }
        
        Future<void> main() async {
           // whatever setup you need...
           runApp (MyApp (await selectStartPage()));
        }
        
        class MyApp extends StatelessWidget {
           final Widget startPage;
           MyApp (this.startPage);
        
           @override Widget build (BuildContext context){
              return MaterialApp(
                 title: '',
                 theme: ThemeData(
                    primarySwatch: Colors.blue,
                 ),
                 initialRoute: startPage,
              );
           }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-03-06
          • 1970-01-01
          • 2015-06-25
          • 2016-07-20
          • 1970-01-01
          • 2017-03-17
          相关资源
          最近更新 更多