@Korsik

Flutter State Management — Provider, как избежать ошибок?

Ввиду небольшого опыта столкнулся с архитектурной ошибкой в разработке приложения, а именно хранение глобального сессионного состояния приложения( например данные авторизации, сессионные настройки пользователя, фильтры контента). То есть мне нужно что-то вроде $_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();
    }
  }
}
  • Вопрос задан
  • 382 просмотра
Пригласить эксперта
Ответы на вопрос 1
Lucian
@Lucian
https://t.me/MakeFreelance
Нужно в самом provider написать функцию, которая делает запрос к серверу и сохраняет результат в provider, видео.
Чтобы хранить сессию на устройстве можно использовать shared_preferences, но нужно предварительно зашифровать, но не обязательно т.к. доступ есть только у root устройств.
Либо hive, там уже встроено шифрование.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы