如何在 flutter 中检查此应用程序是否存在 SharedPreferences
how to check if SharedPreferences exists for this application in flutter
我的 flutter 应用程序每次启动时都会检查 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');
但是数据为空,之后当我进行真正的登录并且数据已经保存时,它工作正常。知道如何以正确的方式处理这个问题吗?
你正在变空,因为你还没有 SharedPreferences KEY;
所以只需将 ??
运算符和 return 一个值。
// 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
}
});
}
您需要使用prefs.containsKey('username')
检查密钥是否存在。
当我使用"shared_preferences"时,我个人使用一个助手来获取和设置,就像这样:
GETTER
static Future<String> getUserName() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getString('username') ?? '';
}
SETTER
static Future<String> setUserName(String value) async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.setString('username', value);
}
要回答您的问题,您无法检查 SharedPreferences "file" 是否存在。你的方法已经正确了。
虽然你已经得到了答案,但在这里我提到了我在我的应用程序中的使用方式。
使用这个设置值
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setBool("login", true);
登录页面containsKey检查
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();
}
注意:您可以在“登录”
上使用任何您想要的东西,例如 'username' 或其他东西
我的 flutter 应用程序每次启动时都会检查 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');
但是数据为空,之后当我进行真正的登录并且数据已经保存时,它工作正常。知道如何以正确的方式处理这个问题吗?
你正在变空,因为你还没有 SharedPreferences KEY;
所以只需将 ??
运算符和 return 一个值。
// 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
}
});
}
您需要使用prefs.containsKey('username')
检查密钥是否存在。
当我使用"shared_preferences"时,我个人使用一个助手来获取和设置,就像这样:
GETTER
static Future<String> getUserName() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getString('username') ?? '';
}
SETTER
static Future<String> setUserName(String value) async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.setString('username', value);
}
要回答您的问题,您无法检查 SharedPreferences "file" 是否存在。你的方法已经正确了。
虽然你已经得到了答案,但在这里我提到了我在我的应用程序中的使用方式。
使用这个设置值
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setBool("login", true);
登录页面containsKey检查
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();
}
注意:您可以在“登录”
上使用任何您想要的东西,例如 'username' 或其他东西