Ввиду небольшого опыта столкнулся с архитектурной ошибкой в разработке приложения, а именно хранение глобального сессионного состояния приложения( например данные авторизации, сессионные настройки пользователя, фильтры контента). То есть мне нужно что-то вроде $_SESSION в PHP.
Есть несколько известных решений:
1. Об`явить глобальную переменную вне функции main, в нее записывать входящие данные с сервера, и дергать из любой части кода, где надо использовать initState и setState. Насколько знаю - такой подход не приветствуется и не желателен.
2. Тоже самое, что 1, только объявить переменную внутри функции main, а далее передавать ее как аргумент в каждый класс виджета. Неуверен в том, насколько это разумно.
3. Использовать Provider. Однако есть неудобство. Использовать Provider можно только в контексте виджета, а менять значения переменных класса Provider только после того, как виджет построен ( Напр.: через onPressed, onChange ) .
Http запрос выполняется до построения виджета и как записать данные запроса в класс Provider непонятно.
Поделитесь опытом решения задачи состояний приложения во Flutter
Вот мой неправильный пример страницы авторизации:
class PageStart extends StatefulWidget{
@override
State<StatefulWidget> createState() {
return _PageStartState();
}
}
//
class _PageStartState extends State<PageStart>{
var actinAuthProfile = ActionAuthProfile(); // for http query method
var status_page = 'load'; // status load page
var data = {}; // session authorization data
@override
void initState() {
super.initState();
actinAuthProfile.CheckAuth().then((gsDataProfile) { // http query - get session data
setState(() {
data = gsDataProfile; // data for Provider class
status_page = gsDataProfile['status']; // change status load page
});
});
}
//
@override
Widget build(BuildContext context) {
var authStateProfile = Provider.of<AuthStateProfile>(context);
authStateProfile.SetDataProfile(data); //! DON`T WORK !!!!!! Exception widget don`t build
switch ( status_page ) {
case 'no_connect':
return progressScreenWidget();
break;
case '/main': return PageMainr();
break;
default: return progressScreenWidget();
}
}
}