Я попытался сделать аутентификацию bloc pattern
, которая:
- обнаружит
LogOutEvent
в любой точке приложения - гарантирует, что все страницы приложения видны только в том случае, если пользователь все еще заблокирован в
Моя идея: сделать BlocBuilder
на моем первом экране и обрабатывать различные состояния соответственно (LoggedOut
=> LoginPage
; LoggedIn => MainPage
).
Моя проблема: я использую Navigator.of(context).push(...)
, чтобы перейти от моего MainPage
к NextPage
, где я могу нажать LogOutButton. При нажатии кнопки изменится только моя базовая страница, поэтому мне понадобится Navigator.of(context).popUntil((route) => route.isFirst)
, чтобы получить желаемый результат (1.). Кроме того, 2. не выполняется, потому что, как только пользователь покидает MainPage
, страницы больше не затрагиваются блоком blo c.
Мой вопрос: есть ли способ использовать bloc pattern
для получить желаемый результат при использовании обычной навигации?
Пример кода:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (context) => AuthBloc(),
child: MaterialApp(
home: MyHomePage(),
));
}
}
class MyHomePage extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.black,
body: BlocBuilder<AuthBloc, AuthState>(
builder: (BuildContext context, state) {
switch (state.runtimeType) {
case AuthLoggedIn:
return MainPage();
break;
case AuthLoggedOut:
return LogInPage();
break;
}
}));
}
}
class MainPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.green,
body: Center(
child: RaisedButton(
onPressed: () => Navigator.of(context)
.push(MaterialPageRoute(builder: (_) => NextPage())))),
);
}
}
class LogInPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.red,
body: Center(
child: RaisedButton(
onPressed: () =>
BlocProvider.of<AuthBloc>(context).add(LogInEvent()))),
);
}
}
class NextPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.blue,
body: Center(child: RaisedButton(onPressed: () {
Navigator.of(context).popUntil((route) => route.isFirst);
BlocProvider.of<AuthBloc>(context).add(LogOutEvent());
})),
);
}
}