【问题标题】:Different screen based on user role not working基于用户角色的不同屏幕不起作用
【发布时间】:2020-11-29 02:30:07
【问题描述】:

您好,我是 Flutter 的新手,正在制作一个预约应用程序,需要筛选两种类型的用户,即患者和医生。

 class DashboardPage extends StatefulWidget {
  @override
  _DashboardPageState createState() => _DashboardPageState();
}

class _DashboardPageState extends State<DashboardPage> {
  UserProvider userProvider;
  final AuthMethods _authMethods = AuthMethods();
  @override
  void initState() {
    super.initState();
  SchedulerBinding.instance.addPostFrameCallback((_) async {
  userProvider = Provider.of<UserProvider>(context, listen: false);
  await userProvider.refreshUser();

  _authMethods. getUserDetails();

});
}


  User user = User();
  @override
  Widget build(BuildContext context) {
      if (user.role == 'patient') {
        return PatientHomePage();
      }
      else if (user.role == 'doctor') {
        return DoctorHomePage();}
      return Container(color: Colors.red,);
  }
}

角色变量在另一个 dart 文件中定义:

class User {   String uid;   String name;   String email;   String role = "patient";   String profilePhoto;    User({     this.uid,     this.name,     this.email,     this.role,     this.profilePhoto,   });   ........... }

当用户登录时,默认值“患者”被分配给它。Future&lt;void&gt; addDataToDb(FirebaseUser currentUser) async { User user = User( uid: currentUser.uid, email: currentUser.email, name: currentUser.displayName, profilePhoto: currentUser.photoUrl, role: "patient"); firestore .collection(USERS_COLLECTION) .document(currentUser.uid) .setData(user.toMap(user)); }这一切都发生在另一个 dart 文件中

但是这个逻辑并没有按预期工作,因为它只在手机上显示红屏,这意味着 从 firebase 获取 user.role 存在一些问题。 请帮帮我...

【问题讨论】:

  • 我没有看到您正在为您在此处创建的新 User 对象 User user = User(); 设置 role 变量。
  • 角色变量定义在另一个 dart 文件中``
  • class User { String uid; String name; String email; String role = "patient"; String profilePhoto; User({ this.uid, this.name, this.email, this.role, this.profilePhoto, }); ........... }
  • 是的,它必须在User模型文件中定义对吧?但是您需要为其分配一个值。你在哪里给它赋值?
  • 用户登录时会为其分配默认值“患者”。Future&lt;void&gt; addDataToDb(FirebaseUser currentUser) async { User user = User( uid: currentUser.uid, email: currentUser.email, name: currentUser.displayName, profilePhoto: currentUser.photoUrl, role: "patient"); firestore .collection(USERS_COLLECTION) .document(currentUser.uid) .setData(user.toMap(user)); } 这一切都发生在另一个 dart 文件中。

标签: firebase flutter


【解决方案1】:
class DashboardPage extends StatefulWidget {
 @override
 _DashboardPageState createState() => _DashboardPageState();
}

class _DashboardPageState extends State<DashboardPage> {
 UserProvider userProvider;
 final AuthMethods _authMethods = AuthMethods();
 User user = User();

 @override
 void initState() {
   super.initState();
   SchedulerBinding.instance.addPostFrameCallback((_) async {
     userProvider = Provider.of<UserProvider>(context, listen: false);
/// This method is future method so it might happen that after widget render you are getting response.
     await userProvider.refreshUser();

/// seState will rebuild your widget with new user details
     setState(() {
       user = _authMethods. getUserDetails();
     });

   });
 }


 @override
 Widget build(BuildContext context) {
   if (user.role == 'patient') {
     return PatientHomePage();
   }
   else if (user.role == 'doctor') {
     return DoctorHomePage();}
   return Container(color: Colors.red,);
 }
}

【讨论】:

  • 我试过了,但现在我收到一个错误,“无法将 'Future' 类型的值分配给 'User' 类型的变量。”
  • 我想补充一点,getUserDetails() 包含Future&lt;User&gt; getUserDetails() async { FirebaseUser currentUser = await getCurrentUser(); DocumentSnapshot documentSnapshot = await _userCollection.document(currentUser.uid).get(); return User.fromMap(documentSnapshot.data); }
  • @AmanSharma 是 _authMethods。获取用户详细信息();是一种未来的方法?如果是,则将 await 放在它之前。
猜你喜欢
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 2021-01-30
  • 2013-05-29
  • 2015-10-08
  • 2019-01-27
  • 2021-04-01
相关资源
最近更新 更多