【问题标题】:Flutter user roles that lead to different screens (firebase)Flutter 导致不同屏幕的用户角色(firebase)
【发布时间】:2021-10-30 20:14:33
【问题描述】:

我是 Flutter 开发的新手,我正在尝试制作一个应用程序,根据他们作为用户的角色将用户重定向到不同的屏幕。从技术上讲,我需要在两个地方实现这一点,在我的 main 构建中,以及在按下登录按钮时。

我现在一直在尝试做的主要是检查用户是否登录,然后获取他的用户 uid,然后使用该 uid 查询数据库以获取他的角色。这似乎是一个非常粗略的解决方案,因为应用程序感觉非常不稳定+崩溃,并且在启动时需要一段时间才能重定向到正确的页面,我不确定我是否应该使用实时数据库而不是正常的数据库.任何有关如何优化这一点的指针将不胜感激。


class MyApp extends StatelessWidget {

  late String userRole;
  late String path;
  @override
  Widget build(BuildContext context) {

    String userUid = FirebaseAuth.instance.currentUser!.uid;

    userRole = "uprav";
    path = "";
    if(FirebaseAuth.instance.currentUser!.uid.isNotEmpty)
      {
        Database.setUserUid(userUid);
        Database.getRole().then((value) {
          userRole = value;
        });

          switch(userRole) {
            case "uprav":
              path = "/repair-flow";
              break;

            case "majs":
              path = "/majstor-flow";
              break;

            case "pred":
              path = "/repair-flow";
              break;
          }


      }

    print(userRole + " this is .then");




    return ScreenUtilInit(
      designSize: Size(375, 812),
      builder: () => MaterialApp(
        debugShowCheckedModeBanner: false,
        title: 'Majstor',
        theme: ThemeData(
          primaryColor: Constants.primaryColor,
          scaffoldBackgroundColor: Color.fromRGBO(255, 255, 255, 1),
          visualDensity: VisualDensity.adaptivePlatformDensity,
          textTheme: GoogleFonts.openSansTextTheme(),
        ),
        initialRoute: FirebaseAuth.instance.currentUser == null ? "/" : path,
        onGenerateRoute: _onGenerateRoute,
      ),
    );
  }
}

Route<dynamic> _onGenerateRoute(RouteSettings settings) {
  switch (settings.name) {
    case "/":
      return MaterialPageRoute(builder: (BuildContext context) {

        return Home();
      });
    case "/repair-flow":
      return MaterialPageRoute(builder: (BuildContext context) {
        return RequestServiceFlow();
      });
    case "/majstor-flow":
        return MaterialPageRoute(builder: (BuildContext context){
          return MajstorServiceFlow();
        });
    default:
      return MaterialPageRoute(builder: (BuildContext context) {
        return Home();
      });
  }
}

【问题讨论】:

  • 我觉得我应该使用 await 或其他东西来确保在执行其他任何操作之前先提取数据;不知道该怎么做。
  • 是的,你是对的!

标签: flutter dart asynchronous


【解决方案1】:

在 Flutter 中,我们使用需要来管理屏幕的状态。 在你的情况下,

状态 1:加载数据 - 显示加载小部件
状态 2:加载数据,需要更新布局 - 根据角色显示屏幕。

有很多方法可以做到这一点:

【讨论】:

    猜你喜欢
    • 2020-11-29
    • 2022-09-27
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 2023-03-19
    • 2021-10-26
    相关资源
    最近更新 更多