一尘不染

使用SharedPreferences设置登录状态并在应用启动时进行检索-Flutter

flutter

我有一个Flutter应用程序,启动该应用程序时必须检查其登录状态,并相应地调用相关屏幕。

用于启动应用程序的代码:

class MyApp extends StatefulWidget {
  @override
  MyAppState createState() {
    return new MyAppState();
  }
}


class MyAppState extends State<MyApp> {

bool isLoggedIn;

    Future<bool> getLoginState() async{
      SharedPreferences pf =  await SharedPreferences.getInstance();
      bool loginState = pf.getBool('loginState');
      return loginState;
      // return pf.commit();
    }

  @override
  Widget build(BuildContext context) {

   getLoginState().then((isAuth){
      this.isLoggedIn = isAuth;
   });


    if(this.isLoggedIn) {return Container(child: Text('Logged In'));}
    else {return Container(child: Text('Not Logged In));}

  }
}

我能够保存SharedPreference并在这里检索它,问题是与getLoginState()异步函数一样,this.isLoggedIn在执行if条件时该属性为null。布尔断言在if语句中失败,并且应用程序崩溃。

isLoggedIn在执行if语句时,如何确保if条件中使用的bool变量具有值?

任何帮助,将不胜感激。


阅读 487

收藏
2020-08-13

共1个答案

一尘不染

您可以使用FutureBuilder解决此问题。

@override
Widget build(BuildContext context) {
 new FutureBuilder<String>(
    future: getLoginState(),
    builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
      switch (snapshot.connectionState) {
        case ConnectionState.active:
        case ConnectionState.waiting:
          return new Text('Loading...');
        case ConnectionState.done:
          if (snapshot.hasData) {
            loginState = snapshot.data;
            if(loginState) {
             return Container(child: Text('Logged In'));
            }
            else {
             return Container(child: Text('Not Logged In));
            }
          } else {
           return  Container(child: Text('Error..));
          }
      }
    },
  )
 }

注意:我们不需要isLoggedIn状态变量。

2020-08-13