【问题标题】:Flutter Firestore different views for different customersFlutter Firestore 针对不同客户的不同视图
【发布时间】:2021-03-06 15:19:43
【问题描述】:

我正在使用 flutter + firebase(auth 和 firestore)构建一个学生导师应用程序。

我有一个包装小部件,用于检查用户是否已登录。如果未登录,我会将他们引导至身份验证屏幕(登录/注册)。如果他们已登录,那么我想检查他们是学生还是导师。

换句话说,在我的包装器中,我需要一种方法来从 firestore 检索用户数据并检查他们的角色,然后将他们引导到适当的屏幕。我不知道该怎么做。请帮忙。这是我的包装类

`class Wrapper extends StatelessWidget {

  static const String id = 'wrapper_screen';

  @override
  Widget build(BuildContext context) {

    final user = Provider.of<User>(context, listen: false); //FirebaseAuth.instance.authStateChanges()

    if (user == null) {
      return AuthenticationScreen();
    }
    else {
// I want to get user profile from firestore using user.uid and based on the role, show them different views
      return DeciderView();
    }
  }`. 

您可以想到一个 Uber 克隆,我希望乘客和司机看到不同的屏幕。如何添加此功能?这就是我希望我的小部件树的样子:1

【问题讨论】:

  • "我想使用 user.uid 并基于角色从 firestore 获取用户配置文件" 你如何存储角色?在 Firestore 文档中?在自定义声明中?
  • 我有一个自定义集合。每个用户都是一个文档,其中 key = uid 和两个字段:电子邮件和角色。当用户注册时,会从表单中获取这些详细信息,并在集合中创建相应的文档。
  • 如果您有用户 uid,只需获取 Firestore 文档:pub.dev/documentation/cloud_firestore/latest/cloud_firestore/…
  • 我明白了。我的问题可能过于初级,但由于这会返回 Future,我如何在包装类(无状态小部件)中使用 async/await 以确保在将用户引导至相关页面之前获得结果?
  • @siaabd001 使用“() 异步 {}();”技术。这使得函数可以立即运行。将您的代码放入 {}。

标签: firebase flutter google-cloud-firestore


【解决方案1】:

我建议使用StreamBuilder,因为它会在用户文档发生更改时重新构建您的应用程序。 语法可能看起来像这样: (如果您已经在 Firestore 上保存了用户数据)

StreamBuilder(
stream: FirebaseFirestore.instance.collection('users').doc(FirebaseAuth.instance.currentUser.uid).snapshots(),
builder: (conext, snapshot){
if (!snapshot.hasData){
return Text('Loading');
}

final userData = snapshot.data.data();

if (userData['role'] == 'student'){
return StudentWidgets();
} 

return TutorWidgets();
})

【讨论】:

  • 谢谢!我最终使用了 FutureBuilder,它可以工作。
猜你喜欢
  • 1970-01-01
  • 2014-09-19
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-10
  • 2019-05-30
  • 1970-01-01
相关资源
最近更新 更多