Задать вопрос
@Artem0071
Безработный mr. Junior

Middleware в Flutter?

Есть следующая структура проекта:

- states
-- authState
-ui
-- screens
--- login_screen
--- splash_screen

Собственно, на данный момент в main.dart происходит следующее:
void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  SharedPreferences prefs = await SharedPreferences.getInstance();

  AuthState authState = AuthState();
  
  GetIt.I.registerSingleton<SharedPreferences>(prefs);
  GetIt.I.registerSingleton<AuthState>(authState);

  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: SplashScreen(), <-- вот тут я не уверен что делаю правильно
    );
  }
}


И splash_screen:
class _SplashScreenState extends State<SplashScreen> {
  late SharedPreferences _prefs;
  late AuthState _authState;

  @override
  void initState() {
    super.initState();
    _prefs = GetIt.I.get<SharedPreferences>();
    _authState = GetIt.I.get<AuthState>();

    _authState.wasIntroduced(_prefs.getBool("was_introduced") ?? false);
  }

  @override
  Widget build(BuildContext context) {
    return Observer(
      builder: (_) {
        if (_authState.isIntroduced) { <-- кажется немного стремным
          return LoginScreen();
        }
        return SplashScreenBody();
      },
    );
  }
}


То есть, что у меня получается:
При запуске приложения подгружается изначально SplashScreen
В нем смотрим в initState(), что если приложение уже было запущено (храним флаг в SharedPreferences), то передаем в AuthState (это Mobx пакет). И если он был загружен, то подгружаем LoginScreen. Иначе билдим SplashScreenBody

В итоге получается следующий стек вьюшек:

main
- splash_screen
-- login_screen
--- app_screen

И если мы в app_screen сделаем условный "выход", то удаляем флаг в SharedPreferences и в AuthState переводим wasIntroduced в false. И тогда удалится сразу все что ниже splash_screen'а

Оно работает, но мне кажется что хранение состояния и splash_screen'а и login_screen'а не очень хорошая затея
Так как это можно сделать правильно? Или это уже правильно?
  • Вопрос задан
  • 103 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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