6

アプリの機能に飛び込む前に、フラッターアーキテクチャを可能な限り最高のものにしようとしています。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 を直接レンダリングできます。それが最善の方法ですか?

私は、クリーンで適切に設計されたアプリから始めるために、可能な限り最高のアーキテクチャを作ろうとしています。

ご協力ありがとうございました。

4

1 に答える 1