Есть следующая структура проекта:
- 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'а не очень хорошая затея
Так как это можно сделать правильно? Или это уже правильно?