アプリの機能に飛び込む前に、フラッターアーキテクチャを可能な限り最高のものにしようとしています。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();
}
}),
);
}
}
このホーム ウィジェットは認証ステータスをリッスンしており、ログインしているかどうかにかかわらず、LoginScreen または DashboardScreen ウィジェットのいずれかを返します。ユーザーがログインすると、LoginScreen はサービスのステータスを更新できます。DashboardScreen は、ログアウトしてステータスを変更することもできます。次に、この Notifier により、レンダリングされるウィジェットが 2 つの画面間で切り替わります。
アプリをより「標準」にするために、生成されたルートをこの作業部分に追加しようとしています。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,
問題は次のとおりです。このルーティングをホームウィジェットで機能させるにはどうすればよいですか?? 実際には、提供されたサービスのステータスを切り替えて、適切なウィジェットの 1 つを返します。このスイッチ内のルートを選択するようなもの:
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 を直接レンダリングできます。それが最善の方法ですか?
私は、クリーンで適切に設計されたアプリから始めるために、可能な限り最高のアーキテクチャを作ろうとしています。
ご協力ありがとうございました。