关闭应用程序后,共享的首选项将被删除

时间:2018-09-13 20:36:11

标签: dart sharedpreferences flutter

我正在使用Flutter构建登录屏幕,并在正确的情况下以共享首选项保存用户数据 然后我在第二个屏幕中测试了保存的数据,它已经被保存了 当应用关闭并再次打开时,我检查共享首选项,但它变为null 那就是我的saveData和getData函数

sympy.nsolve

我应该提两件事 不建议使用“提交”功能 第二个是代码正在使用不建议使用的提交,但是现在不是 我删除了我所做的所有更改,但仍然无法正常工作 在我的设备和其他设备上,不知道为什么! 如果没有解决方案,在扑扑中是否有替代共享偏好的替代方法? 那就是我使用saveDataPref()

的地方
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(                 users [phone] .phone,users [phone] .name,“ user”,users [phone] .ordered);

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() 我使用从另一个屏幕检索数据,它的工作原理 但是当关闭应用程序并再次打开它时,我使用getDataPref()但检索到的数据为null 在这里,我使用getDataPref()来检查用户是否已经注册,因此请转到UserApp屏幕,如果未打开主屏幕,则进入

      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);
  }
}

3 个答案:

答案 0 :(得分:0)

我在这里找到了解决方案 Flutter: Shared Preferences null on Startup 并注意 如果您像我以前那样在主类之外调用共享首选项,将无法正常工作 您应该在initState()中调用它 可行

@override
  void initState() {
    super.initState();
    readFile('phone');
    SharedPreferences.getInstance().then((SharedPreferences sp) {
      sharedPreferences = sp;
      ph = sp.getString('phone');
      setState(() {});
    });
  }

答案 1 :(得分:0)

我得出的结论是,由于数据丢失,我在我的应用程序中使用了prefs.clear()。确保您的任何活动中都没有写prefs.clear()。

答案 2 :(得分:0)

确保您没有在代码中的任何地方调用 pref.clear();

loadUserId() async {
SharedPreferences pref = await SharedPreferences.getInstance();
setState(() {
  userId = pref.getString("userId");
});}

最后像这样在 initState() 中调用上面的函数:

@override
    void initState() {
     super.initState();
      loadUserId();
 }