Значение SharedPreference null при запуске - PullRequest
0 голосов
/ 20 апреля 2020

Существует переменная pinEnable, которая сообщает приложению, настроил ли пользователь пин-код для приложения. Это хранится в SharedPreferences. Моя первая страница, которая появляется в моем приложении, зависит от этого. Поскольку операция извлечения asyn c, она просто возвращает null.

соответствующий код, который я использовал: -

PinData - это просто класс, содержащий функции для установки и get pin и pinEnable

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

class MyApp extends StatefulWidget {

  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool pinEnable;
  PinData pinData = PinData();

  updatePinEnable() async {
    pinEnable = await pinData.getPinEnable();
    print(pinEnable);
  }

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        theme: ThemeData(...),
        home: pinEnable == false ? MyTabbedHome() : PinCodePage());
  }
}

В последнем выражении кода pinEnable не является ложным, но имеет значение null, поэтому возвращает PinCodePage()

Есть ли способ исправить это или любые идеи, чтобы обойти это. Спасибо !!

1 Ответ

0 голосов
/ 20 апреля 2020

Вам не нужен виджет с отслеживанием состояния, и это лучшее решение, использующее FutureBuilder для возврата правильного виджета только после завершения асинхронного c процесса:

Редактировать: отредактировал код, чтобы учесть тот факт, что вы не устанавливаете начальное значение в общих префиксах

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

class MyApp extends StatelessWidget {
  PinData pinData = PinData();

  Future<bool> isPinEnabled() async => pinData.getPinEnable();

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<bool>(
        future: isPinEnabled(),
        builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
          if (snapshot.connectionState == ConnectionState.waiting) {
            return CircularProgressIndicator();
          }
          else if (snapshot.connectionState == ConnectionState.done) {
            if (snapshot.hasData) {
              return snapshot.data ?
              PinScreen() //if true returned from shared prefs go to pin screen
                  :
              HomeScreen(); //if false returned from shared prefs go to home screen
            }
            else {
              return HomeScreen(); //if null returned from shared prefs go to home screen
            }
          }
        }
    );
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...