我有一个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语句中失败,并且应用程序崩溃。
SharedPreference
getLoginState()
this.isLoggedIn
isLoggedIn在执行if语句时,如何确保if条件中使用的bool变量具有值?
isLoggedIn
任何帮助,将不胜感激。
您可以使用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状态变量。