#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(), Чтобы метод загрузки данных мог выполняться синхронно