Маршрутизация Flutter с Firebase Auth и ChangeNotifierProvider

Я пытаюсь сделать свою архитектуру флаттера как можно лучше, прежде чем углубляться в особенности своего приложения. Я уже сделал приложение с работающей аутентификацией firebase на основе ChangeNotifierProvider:

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.lightBlue,
      ),
      home: Home(),
    );
  }
}

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      builder: (_) => AuthentService.instance(),
      child: Consumer(builder: (context, AuthentService authentService, _) {
        switch (authentService.status) {
          case Status.Authenticated:
            return DashboardScreen();
          default:
            return LoginScreen();
        }
      }),
    );
  }
}

Этот виджет Home прослушивает статус аутентификации и возвращает любой из виджетов LoginScreen или DashboardScreen, если вы вошли в систему или нет. LoginScreen может обновлять статус службы, если пользователь входит в систему. DashboardScreen также может изменять статус, выходя из системы. Затем из-за этого средства уведомления отображаемый виджет переключается между двумя экранами.

Я пытаюсь добавить сгенерированные маршруты в эту рабочую часть, чтобы сделать мое приложение более "стандартным". Я определил несколько маршрутов в класс Router:

class Router {
  static const String homeRoute = '/';
  static const String loginRoute = '/login';
  static const String dashboardRoute = '/dashboard';

  static Route<dynamic> generateRoute(RouteSettings settings) {
    switch (settings.name) {
      case homeRoute:
        return MaterialPageRoute(builder: (_) => Home());
      case loginRoute:
        return MaterialPageRoute(builder: (_) => LoginScreen());
      case dashboardRoute:
        return MaterialPageRoute(builder: (_) => DashboardScreen());
    }
  }
}

Теперь я могу изменить свой виджет MyApp:

onGenerateRoute: Router.generateRoute,
initialRoute: Router.homeRoute,

Вопрос: как заставить работать эту маршрутизацию в виджете Home?? На самом деле, я переключаю статус моей предоставленной услуги и возвращаю один из хороших виджетов. Что-то вроде выбора маршрута внутри этого переключателя:

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      builder: (_) => AuthentService.instance(),
      child: Consumer(builder: (context, AuthentService authentService, _) {
        switch (authentService.status) {
          case Status.Authenticated:
            return DashboardScreen();
          default:
            return LoginScreen();
        }
      }),
    );
  }
}

Как пользоваться навигатором? Я не могу использовать Navigator.pushNamed внутри переключателя. Он должен вернуть виджет. Может быть, я ошибаюсь, это может быть проще, если LoginScreen должен обрабатывать навигацию, если вход в систему прошел успешно? Таким образом, виджет Home может напрямую отображать LoginScreen. Это лучший способ сделать?

Я пытаюсь создать лучшую архитектуру, чтобы начать с чистого и хорошо разработанного приложения.

Спасибо за помощь.

1 ответ

Если вы хотите добавить навигатор внутри Widget build(), вы можете использовать Future.microtask. Это должно запланировать задачу после buildцикл.

      Future.microtask(() => Navigator.push(
  context, 
  MaterialPageRoute(builder: (context) => LoginScreen())
));
Другие вопросы по тегам