使用 firebase auth 和 firestore 在流中调用未来

Posted

技术标签:

【中文标题】使用 firebase auth 和 firestore 在流中调用未来【英文标题】:Calling a future in a stream with firebase auth and firestore 【发布时间】:2021-02-22 18:56:37 【问题描述】:

我试图让 StreamProvider 在应用程序的其余部分提供一个“kaizenUser”对象。为了获得这个“KaizenUser”,我已经从 firebase 身份验证中删除了用户。然后使用 firebase auth 用户的 uid,我用它来访问我自己的用户文档表单 firebase.firestore 以使用我的 firestore 用户添加的“角色”信息创建 KaizenUser。

花了几天时间与身份验证服务中的代码搏斗,我想我已经很接近了......

从 StreamProvider 开始:

Widget build(BuildContext context) 
    return StreamProvider<KaizenUser>.value(
      value: AuthService().user,
      child: MaterialApp(
        debugShowCheckedModeBanner: false,
        home: Wrapper(),
      ),
    );
  

身份验证服务类。 获取用户流调用 userFromFirebaseUser,我在其中调用 getRole 来查找 firestore 中等效用户的文档引用和“角色”字段。 然后返回 userFromFirebaseUser,使用该角色字段创建一个完整的 KaizenUser,它将通过流传递。

class AuthService 
  final FirebaseAuth _auth = FirebaseAuth.instance;

  // auth change user stream
  Stream<KaizenUser> get user async* 
    yield* _auth
        .authStateChanges()
        .map((User user) => _userFromFirebaseUser(user));
  

  //Create KaizenUser object based on firebase user
  KaizenUser _userFromFirebaseUser(User user) 
    String role = getRole(user.uid) as String;
    KaizenUser kaizenUser =
        KaizenUser(uid: user.uid, email: user.email, role: role);
    return kaizenUser;
  

  // ignore: missing_return
  Future<String> getRole(String uid) async 
    var doc =
        await FirebaseFirestore.instance.collection('users').doc(uid).get();
    return doc.data()['role'];
  

错误是: Future 类型在类型转换中不是 String 类型。

在写这篇文章的同时,我认为代码的问题行'as String'

String role = getRole(user.uid) as String;

非常感谢任何帮助!

【问题讨论】:

【参考方案1】:

错误是因为您没有等待返回的未来结果。尝试以下方法:

String role = await getRole(user.uid):

【讨论】:

正确,我正在使用智能手机,当我回答您的问题时无法完全看到您的代码,否则我会建议您进行更改。它解决了你的问题吗? 这种变化让我走上了一条变化之路,最后我更加困惑:我试过了,然后不得不将异步添加到 _userFromFirebaseUser 函数并将返回更改为 Future。然后我必须将 Stream 更改为 Stream>。然后在 StreamProvider 中将其更改为 > 最后在小部件树中的所有提供者端点中将它们全部更改为未来的 kaizen 用户,然后在树中的端点之一:```最终用户 = Provider.of>(上下文); ``` 我通常在 Provider.of 上调用 user.uid 但 uid 不再可用,因为它现在是未来。现在的选项是:asStream()、catchError()、then()、whenCompleted()、timeout()。 如果你有很多其他的改变,你可以简单地尝试一下>>> String role = Future.value(getRole(user.uid)); 繁荣就是我所追求的!我知道当我开始走这条线时,必须有一种方法可以将更改仅保留在身份验证服务类中

以上是关于使用 firebase auth 和 firestore 在流中调用未来的主要内容,如果未能解决你的问题,请参考以下文章

使用自己的身份验证服务器的firebase-auth模块和firebase-common-auth的重复

使用自己的身份验证服务器复制 firebase-auth 模块和 firebase-common-auth

使用 auth0 Firebase 和 Ionic 进行 Linkedin 身份验证

Firebase Auth 使用电话号码和密码

request.auth != null 和 request.auth == null 不提供访问权限,其中 true 提供 - firebase 存储

如何使用 firebase_auth 和 provider 检测身份验证更改