我有一个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
具有值?
任何帮助将不胜感激。
答案 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
状态变量。