SharedPreferences не работает на реальном устройстве FLUTTER - PullRequest
0 голосов
/ 23 марта 2020

Я использовал SharedPreferences, чтобы запомнить имя пользователя и пароль для входа в следующий раз без запроса пароля. Это работало хорошо, когда я отлаживал, используя свое реальное устройство с USB-кабелем. Но он не работает на моем устройстве, когда я собираю APK и устанавливаю его. Я не знаю, что мне не хватает.

Я сохраняю данные на странице входа в систему вот так:

Future<Null> loginUser(isLogin, name, fac, year, gender) async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('Name', name);
prefs.setString('IsLogin', isLogin);
prefs.setString('Faculty', fac);
prefs.setString('Year', year);
prefs.setString('Gender', gender);
prefs.setString('Email', email);

print(prefs.getString('Faculty'));

}

Я использовал этот код на главной странице. ...

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
  Widget build(BuildContext context) {
    return NewMain();
  }
}

class NewMain extends StatefulWidget {
  @override
  _NewMainState createState() => _NewMainState();
}

class _NewMainState extends State<NewMain> {
  var name, fac, year, gender, email;
  var goToLogin = true;
  @override
  void initState() {
    // TODO: implement initState
    checkRem();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    if (goToLogin)
      return MaterialApp(
        home: Login(),
      );
    else
      return MaterialApp(
        home: MainClass(name, fac, year, gender, email),
      );
  }

  void checkRem() async {
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    if (prefs.getString('IsLogin') == 'Yes') {
      goToLogin = false;
      fac = prefs.getString('Faculty');
      name = prefs.getString('Name');
      gender = prefs.getString('Gender');
      year = prefs.getString('Year');
      email = prefs.getString('Email');
    }
  }
}

Он перейдет в MainClass, если goToLogin имеет значение false. Он отлично работает в отладке. Он не работает на встроенном приложении apk.

1 Ответ

0 голосов
/ 23 марта 2020

Проблема в том, что вы вызываете checkRem(), что является асинхронным c в initState(), поэтому метод сборки вызывается до полного выполнения checkRem().

Soln: оберните его futureBuilder() или вызовом setState() после полного выполнения метода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...