Маршрутизация 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())
));