общие настройки удаляются при закрытии приложения - PullRequest
0 голосов
/ 13 сентября 2018

Я создаю экран входа в систему, используя флаттер, и сохраняю пользовательские данные в общих настройках, если это правильно, тогда я проверил сохраненные данные на втором экране, и они уже были сохранены, когда приложение закрывается и снова открывается, я проверяюразделяемый префикс, но он становится нулевым, это мои функции 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');
}

Я должен упомянуть две вещи: функция "commit" устарела, вторая заключается в том, что код работал с устаревшей фиксацией, но это не такЯ удалил все внесенные изменения, но они все еще не работают на моем устройстве и других устройствах, и я не знаю, почему!если нет решения, есть ли альтернатива общим предпочтениям во флаттере?вот где я использую 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 (пользователи [телефон] .phone, пользователи [телефон] .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(),
    );
  }
}

1 Ответ

0 голосов
/ 16 сентября 2018

я нашел решение здесь Flutter: общие настройки null при запуске и обратите внимание, что разделенное предпочтение не сработает, если вы назвали его вне основного класса, как я это делал раньше Вы должны вызвать его внутри initState () это работает

@override
  void initState() {
    super.initState();
    readFile('phone');
    SharedPreferences.getInstance().then((SharedPreferences sp) {
      sharedPreferences = sp;
      ph = sp.getString('phone');
      setState(() {});
    });
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...