Я создаю список предприятий через RestAPI в initstate. Мне нужно использовать значение sharedpreference в качестве одного из его параметров, но когда я пытаюсь загрузить данные, значение sharepreference имеет нулевое начальное значение, но это значение можно легко использовать в других виджетах.
Проблема в том, как прочитать значение sharepreference и использовать одновременно в initstate.?
Я пробовал много вариантов, таких как удаление моего API из состояния инициализации и определение с помощью асинхронной функции и вызов ее в состоянии инициализации.
**@override
void initState() {
super.initState();
loadData();
getBizList();
}
getBizList() async {
await api
.bizListAPI(widget.subCatid, savedCityID, supSubFinal, areaFinal)
.then((response) {
setState(() {
bizListOBJ = response;
});
});
}
loadData() async {
SharedPreferences savedPref = await SharedPreferences.getInstance();
setState(() {
savedCity = (savedPref.getString('savedCity') ?? "Mumbai");
savedCityID = (savedPref.getString('savedCityID') ?? "1");
});
}**
в приведенном выше коде я могу получить или прочитать данные и показать название города из sharedpreference (savedCity), который находится на панели приложений, но я хочу использовать данные savecityID для передачи в мой API в initstate.
Я также пытался использовать следующий плагин
[https://medium.com/@greg.perry/a-flutter-class-for-app-preferences-a256166ecc63.][1]
Благодаря этому я смог делать то, что хотел, но каждый раз, когда я закрывал приложение и открывал его снова... я получил следующую ошибку
"_prefsInstance != null,
"Maybe call Prefs.getKeysF() instead. SharedPreferences not ready yet!");"
после этого, когда я возвращаюсь и снова открываю страницу, список приложений и бизнесов работает идеально, пока я снова не закрою свое приложение.
[1]: https://medium.com/@greg.perry/a-flutter-class-for-app-preferences-a256166ecc63
извините за любое нубское объяснение или вопрос. На самом деле это мой первый вопрос в стеке, и я новичок в флаттере.
Вам нужно использовать состояние установки внутри состояния инициализации, потому что
loadData();
getBizList();
являются асинхронной функцией, поэтому вам нужно обновить страницу, чтобы получить значение.
Попробуй это
@override
void initState() {
// TODO: implement initState
super.initState();
setState(() {
loadData();
getBizList();
});
}
setstate обязателен, но здесь он мне не помог.
Вы можете попробовать это?
void initState() {
super.initState();
loadData().then((_) {
getBizList();
});
}
Я попробовал это, и это сработало ... спасибо, но есть другое решение, которое я нашел более удобным, поместив все мои API и в асинхронную функцию, а затем заставив мои API ждать ответа, наконец, поместив функцию в initstate ( ),
Извините, это не то, как вы это делаете.