在尝试深入了解我的应用程序功能之前,我正在尝试使自己的Flutter架构尽可能地好。我已经基于ChangeNotifierProvider创建了一个具有Firebase身份验证功能的应用程序:
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。那是最好的方法吗?
从一个干净且设计良好的应用程序开始,我正在努力使最佳架构成为可能。
谢谢您的帮助。