Не удается загрузить sharedpreferences в flutter

#flutter #sharedpreferences

#flutter #sharedpreferences

Вопрос:

Итак, я пытался создать гостевой режим и пользовательский режим, где, если токен равен нулю, он вернет страницу гостевого режима и наоборот.

Проблема в том, что мой токен всегда равен нулю, из-за чего он переходит в гостевой режим вместо пользовательского.

Токен равен нулю, потому что, когда я пытаюсь отладить, программа пропустила token = prefs.getString(_sessionTokenKey); Я проверил _sessionTokenKey хранилище, и там есть токен.

 static void loadToken() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    token = prefs.getString(_sessionTokenKey);
}

static Widget _homeBuilder(BuildContext context) {
    loadToken();
    print("this is token from route generator");
    print(token);
    if (token == null) {
        return BottomNavBarGuestMode();
    } else {
        return BottomNavBar();
    }
}

static Route<dynamic> generate(RouteSettings settings) {
    switch (settings.name) {
      case Routes.main:
        return MaterialPageRoute(builder: _homeBuilder, settings: settings);
      default:
        return MaterialPageRoute(builder: (_) => RouteErrorPage());
    }    
}
  

Ответ №1:

Ваш loadToken асинхронный. Таким образом, токен равен нулю, потому что вы не ждете ответа loadToken .

Решение:

Добавьте await перед вашим laodToaken() вызовом.

Комментарии:

1. куда мне нужно его поместить?

2. измените «loadToken ();» на «ожидание loadToken ();»

3. нужно ли добавлять асинхронность в _homebuilder?

4. Это не работает, конструктор в методе route не может принять метод _homebuilder

5. Что ж, тогда вам придется обрабатывать асинхронность SharedPreferences другим способом. Я постараюсь обновить свой ответ. Где вы выполняете фактический навигационный вызов?

Ответ №2:

Вы не придерживаетесь правильного подхода к использованию общих настроек. Просто создайте класс с вашим appname и добавьте статический экземпляр для общих предпочтений следующим образом:

 class AppName{
static SharedPreferences prefs;
}
  

теперь в вашем основном методе инициализируйте префы, также сделайте вашу основную функцию асинхронной следующим образом:

 Future<void> main() async {
AppName.prefs = await SharedPreferences.getInstance();
}
  

Поскольку у вас уже есть настройки, вы можете легко их использовать.Итак, теперь измените свой метод loadToken следующим образом:

 String loadToken(){
    final prefs = AppName.prefs;
    token = prefs.getString(_sessionTokenKey);
    return token;
}
  

И измените свой код _homeBuilder, как показано ниже:

 static Widget _homeBuilder(BuildContext context) {
    token = loadToken();
    print("this is token from route generator");
    print(token);
    if (token == null) {
        return BottomNavBarGuestMode();
    } else {
        return BottomNavBar();
    }
}
  

Вам может потребоваться импортировать класс AppName везде, где требуется.

Комментарии:

1. Я пробовал это, но результат префикса равен нулю

2. @Vince Поскольку область видимости переменной токена неясна, поэтому для этого я обновил ответ. Теперь это должно сработать

3. AppName.prefs = ожидает SharedPreferences.getInstance(); prefs не получает экземпляр

4. @Vince ты сделал основную функцию асинхронной?

5. Я сделал, и он не получает экземпляр

Ответ №3:

Я обнаружил, что мне нужно использовать FutureBuilder(), Чтобы метод загрузки данных мог выполняться синхронно