我的颤振应用程序每次启动时都会检查SharedPreferences
中保存的数据。 稍后在应用程序中使用它,但是当我第一次在设备中运行该应用程序时,SharedPreferences
保存了,因此它null
获取所有数据。 所以我想确保它检查文件本身是否存在,而不是检查特定值,
注意:我正在使用这个shared_preferences的 futter 包。
这是我的代码:
checkingTheSavedData() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
String username = prefs.getString('username');
if (username == null) {
Navigator.pushReplacementNamed(context, '/login');
} else {
Navigator.pushReplacementNamed(context, '/main_page');
}
}
因此,对于第一次运行,它确实Navigator.pushReplacementNamed(context, '/main_page');
但数据为空,之后当我进行真正的登录并且数据已经保存时,它工作正常。 知道如何以正确的方式处理这个问题吗?
您需要使用prefs.containsKey('username')
检查密钥是否存在。
当我使用"shared_preferences"时,我个人使用一个助手来获取和设置,就像这样:
吸气剂
static Future<String> getUserName() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getString('username') ?? '';
}
二传手
static Future<String> setUserName(String value) async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.setString('username', value);
}
要回答您的问题,您无法检查共享首选项"文件"是否存在。您的方法已经正确。
您正在变空,因为您还没有共享首选项密钥; 所以只需输入??
运算符并返回一个值。
// Separated shared preferences method is a good call
Future<bool> isUserLoggedIn() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getBool(IS_LOGGED_KEY) ?? false;
}
// Your logic
void checkingTheSavedData() {
isUserLoggedIn().then((isLogged) {
if (isLogged) {
// foo
} else {
// bar
}
});
}
虽然你已经得到了答案,但在这里我提到了我如何在我的应用程序中使用。
使用此设置值
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setBool("login", true);
检查方式包含登录页面中的密钥
SharedPreferences prefs = await SharedPreferences.getInstance();
if (!prefs.containsKey("login")) {
Navigator.of(context).push(MaterialPageRoute(
builder: (context) {
return LoginPage();
},
));
}
还要像这样签入注销页面
SharedPreferences prefs = await SharedPreferences.getInstance();
if(prefs.containsKey("login")) {
prefs.remove("login");
Utils.successToast("Logout successfully");
Navigator.of(context).pop();
}
注意:您可以使用任何您想要的内容,例如"用户名"或其他内容,而不是在"登录"上