Флаттер - Blo c в сочетании с навигацией - PullRequest
0 голосов
/ 15 апреля 2020

Я попытался сделать аутентификацию bloc pattern, которая:

  1. обнаружит LogOutEvent в любой точке приложения
  2. гарантирует, что все страницы приложения видны только в том случае, если пользователь все еще заблокирован в

Моя идея: сделать 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());
      })),
    );
  }
}
...