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

时间:2018-08-29 15:10:44

标签: dart 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()是一个异步函数,因此在执行if条件时this.isLoggedIn为null。布尔断言在if语句中失败,应用程序崩溃。

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

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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状态变量。