android - 使用 Firebase Auth 和 ChangeNotifierProvider 进行 Flutter 路由

标签 android flutter routing firebase-authentication flutter-change-notifier

在深入研究我的应用程序的功能之前,我正在努力使我的 flutter 架构尽可能好。我已经基于 ChangeNotifierProvider 制作了一个带有 firebase Authentification 的应用程序:

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。这是最好的方法吗?

我试图从一个干净且设计良好的应用程序开始,尽可能地创造出最好的架构。

谢谢您的帮助。

最佳答案

如果您想在 Widget build() 中添加导航器, 你可以使用 Future.microtask .这应该在 build 之后安排任务。循环。

Future.microtask(() => Navigator.push(
  context, 
  MaterialPageRoute(builder: (context) => LoginScreen())
));

关于android - 使用 Firebase Auth 和 ChangeNotifierProvider 进行 Flutter 路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59506046/

相关文章:

java - Android 异步 - 在 Android 中的 onPostExecute 中打开新 Activity ( Intent )

Android 软键盘不正常

Android 使用 ImageView 淡入淡出

asp.net - 在 Web.config 中配置 ASP.NET 路由

Angular 5 router.navigate 不起作用

ruby-on-rails - 默认 :exclude option for Rails resource routing

Android 谷歌服务位置成本和限制

intellij-idea - 如何将数据记录到 Flutter 控制台?

flutter - 画中画模式如何进入jitsi session 室?

dart - Flutter:我应该每页使用 BloC 类(UI/View)吗?