我有一个在其下设置的类,并获取bool值来记住用户并下次自动登录。
import 'package:shared_preferences/shared_preferences.dart';
class SettingHelper {
static Future<bool> getValue(String key) async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
var s = prefs.getBool(key);
print("GetValue ${s.toString()}"); //prints "GetValue true"
return s;
}
static Future<void> setValue(String key, bool value) async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setBool(key, value);
}
}
我在“登录”页面中使用CheckBox值设置了值。
onPressed: () {
...
SettingHelper.setValue("rememberMe", checkBoxValue);
...
}
当我开始调试时,我看到setValue有效。 但是当我热重启时,getValue在initState()中返回null,但在函数中返回true。这是代码:
class LandingPage extends StatefulWidget {
@override
_LandingPageState createState() => _LandingPageState();
}
class _LandingPageState extends State<LandingPage> {
bool rememberMe;
void _getRememberMeChoice() async {
rememberMe = await SettingHelper.getValue("rememberMe");
}
@override
void initState() {
super.initState();
_getRememberMeChoice();
}
@override
Widget build(BuildContext context) {
print(rememberMe); //Returns null
if (rememberMe == true) {
return BridgeList();
} else
return LoginScreen();
}
}
这些是输出:
I/flutter (11724): null
I/flutter (11724): GetValue true
请告诉我我做错了什么...
答案 0 :(得分:0)
那是因为您无法等待initState()
在这种情况下,在获取build()
值之前先执行rememberMe
函数。
尝试在setState((){})
之后添加getValue()
,以便进行重建。
喜欢
void _getRememberMeChoice() async {
rememberMe = await SettingHelper.getValue("rememberMe");
setState((){})
}
此外,请注意,在第一次执行build
时,rememberMe
值将为null
。因此,您应该在您的if
条件中添加该验证。