如何在StatelessWidget.build方法中调用异步方法?

时间:2020-05-02 11:28:19

标签: flutter dart

我下面的代码扑朔迷离。在initialRoute:属性中,它需要调用isLoggedIn()方法,这是一个异步函数。我收到一个错误,说我需要在await函数中调用async。但是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();
        },
      }

    );
  }
}

3 个答案:

答案 0 :(得分:1)

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

initialRoute: '/user-auth'

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

答案 1 :(得分:0)

据我说,不可能做你想做的事。

正如您提到的,isLoggedIn是异步的,这将花费一些时间来计算,同时构建方法会完成构建。您可以使用 futureBuilder 在“无状态”小部件中执行异步任务,但是由于这是您的初始路线,因此必须提供它,因此再次无法使用。

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

答案 2 :(得分:0)

当我遇到这个问题时,我通过将 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,
      );
   }
}