dart - 关闭应用程序时删除共享首选项
问题描述
我正在使用颤振构建登录屏幕并将用户数据保存在共享首选项中(如果正确)然后我在第二个屏幕中测试了保存的数据,并且当应用程序关闭并再次打开时它已经保存我检查共享首选项但是它变为 null 那是我的 saveData 和 getData 函数
String namePref,phonePref, typePref,statePref;
Future saveDataPref(String name,String phone, String type, String state )async{
SharedPreferences pref = await SharedPreferences.getInstance();
pref.setString('phone', phone);
pref.setString('name', name);
pref.setString('type', type);
pref.setString('state', state);
pref.commit();
print('pref stored');
print('${pref.getString('phone')}');
}
Future getDataPref() async{
SharedPreferences pref = await SharedPreferences.getInstance();
phonePref = pref.getString('phone');
namePref = pref.getString('name');
typePref = pref.getString('type');
statePref = pref.getString('state');
}
我应该提到两件事“提交”功能已被弃用,第二件事是代码正在使用已弃用的提交,但现在我没有删除我所做的所有更改,但它仍然无法在我的设备和其他设备上运行并且不要不知道为什么!如果没有解决方案,在颤振中是否有任何替代共享偏好的方法?那就是我使用 saveDataPref() 的地方
Future login(BuildContext context) async {
String password = passwordController.text;
String phone = phoneController.text;
print("entered login function");
//check if the user is registered
Map<String, User> users = new Map<String, User>();
users = await getUserDataFromFireStore();
if (await userCheck(phone)) {
// user is registered check if it is the right password
if (users[phone].password == password) {
// check if the user have an order
saveDataPref(用户[手机].手机,用户[手机].name,“用户”,用户[手机].ordered);
if (users[phone].ordered == "true") {
Navigator.push(
context, MaterialPageRoute(builder: (context) => OrderBinding()));
return;
} else {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => UserApp(
userName: users[phone].name,
userPhone: users[phone].phone,
)));
return;
}
} else {
ShowDialogue(
"تم إدخال كلمة السر بشكل خاطئ من فضلك تأكد من كلمة السر", context);
}
}
Map<String, Driver> drivers = new Map<String, Driver>();
drivers = await getDriverDataFromFireStore();
if (await DriverCheck(phone)) {
// user is registered check if it is the right password
if (drivers[phone].password == password) {
//check if driver account is activated
if (drivers[phone].activation == "true") {
saveDataPref(drivers[phone].phone, drivers[phone].name, "driver",
drivers[phone].activation);
Navigator.push(
context, MaterialPageRoute(builder: (context) => DriverApp()));
} else {
ShowDialogue(
"لم يتم تفعيل حسابكم بعد يرجى الانتظار وسيتم التواصل معكم قريباً",
context);
}
} else {
ShowDialogue(
"تم إدخال كلمة السر بشكل خاطئ من فضلك تأكد من كلمة السر", context);
}
} else {
ShowDialogue(
"لم يتم تسجيل هذا المستخدم من فضلك قم بانشاء حساب اولا", context);
}
}
在这里我检查登录数据是否正确我测试了函数并且我工作它打开了 saveDataPref() 我使用从另一个屏幕检索数据并且它工作但是当关闭应用程序并再次打开它时我使用 getDataPref() 但检索到的数据此处为空,我使用 getDataPref() 检查用户是否已经注册,所以转到 UserApp 屏幕,如果没有打开主屏幕
checkSigned() {
getDataPref();
print("${phonePref}");
print("${namePref}");
if (phonePref != null) {
print("${phonePref}");
if (phonePref != "") {
print("${phonePref}");
return new UserApp(
userName: namePref,
userPhone: phonePref,
);
} else {
return new MyHomePage();
}
} else {
return new MyHomePage();
}
}
void main() {
runApp(new MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Generated App',
theme: new ThemeData(
primarySwatch: Colors.lightGreen,
primaryColor: const Color(0xFF8BC34A),
accentColor: const Color(0xFF8BC34A),
canvasColor: const Color(0xFFEEEEEE),
),
home: checkSigned(),
);
}
}
解决方案
我得出的结论是,由于数据丢失,我在我的应用程序中使用了 prefs.clear()。确保在您的任何活动中都没有编写 prefs.clear()。
推荐阅读
- javascript - 异步等待无法正常工作
- r - ggplot2饼图,不出现数字
- json - firebase 返回的未知数据格式
- java - 如何在 RecyclerView 顶部默认启用新数据显示?
- php - XAMPP:作曲家返回错误而不是创建新的laravel项目
- spring - 如何在 YML 文件 spring boot 中配置 SSL mongodb 连接?
- ios - 查看在 iPhone plus 型号上无法正确显示
- android - 绑定的服务方法可以在 Activity 中访问,即使在它被取消绑定和停止之后
- python - 在 PyCharm 中添加代码模板 - 可以吗?
- kaggle - 无法加载 Resnet