【问题标题】:Flutter: Firebase auth and Firestore snapshot streamFlutter:Firebase 身份验证和 Firestore 快照流
【发布时间】:2019-05-17 21:41:07
【问题描述】:

在我的颤振应用程序中,我使用 firebase 进行身份验证和 firestore 数据库。我也在尝试遵循 BLOC 模式。

成功登录后,我需要使用存储在文档中的一些数据来构建我的 UI 屏幕:

 @override
  Widget build(BuildContext context) {

    return FutureBuilder(
      future: Auth.of(context).firebase.uid(), 
      builder: (context, snap){

        if(snap.hasData) {
          print("Your uid is ${snap.data}");
          return StreamBuilder(

            stream: Firestore.instance.collection('USERS').document(snap.data).collection('PHOTOS').document(
                widget.photoID).snapshots(),
            builder: (context, AsyncSnapshot<DocumentSnapshot> snap) {...}

现在,一切正常。

Auth 是 Firebase Auth 扩展 InheritedWidget 的包装类,其中 .uid() 方法返回带有用户标识符的 Future。 然后我使用 StreamBuilder 构建 UI,通过 uid 获取 DocumentSnapshot。

所以这是我的问题:是否有更好的方法来实现这一点并避免将 StreamBuilder 嵌套在 FutureBuilder 中?

【问题讨论】:

标签: firebase dart flutter google-cloud-firestore bloc


【解决方案1】:

更新: firebase.uid() 现在是同步而不是异步,因为 0.18.0。所以你可以直接在你的信息流中使用它。

旧答案:

RxDart 是您所需要的,您可以将FutureStream 组合起来,然后再将它们传递给StreamBuilder

  var mergedStream = Auth.of(context).firebase.uid().asStream().flatMap((uid) =>
      Firestore.instance
          .collection('USERS')
          .document(uid)
          .collection('PHOTOS')
          .document(widget.photoID)
          .snapshots());

然后你可以在你的StreamBuilder中使用这个流

【讨论】:

    【解决方案2】:

    您可以在 Material App 上方使用 StreamProvider,使用 Provider.of 将身份验证用户提供给您的任何小部件,然后在单独的类中调用 AuthStateChaged。这会将身份验证用户从已登录到 null 流式传输到未自动登录。然后您可以根据需要围绕您的应用程序的用户。

    【讨论】:

      【解决方案3】:

      您可以创建一个 async 函数,该函数返回 Firestore 快照并允许我们在没有 FutureBuilder 的情况下获取 uid 未来,并在函数内部处理 uid。

      _getData() async{
          String uid = await Auth.of(context).firebase.uid();
          var snapshots = await Firestore.instance.collection('USERS')
              .document(snap.data)
              .collection('PHOTOS')
              .document(widget.photoID).snapshots();
          return snapshots;
      }
      

      我们将在 StreamBuilder 中使用这个函数

      @override
        Widget build(BuildContext context) {
          return StreamBuilder(
            stream: _getData(), 
               builder: (context, AsyncSnapshot<DocumentSnapshot> snap) {...}
          );
      }
      

      这是我避免嵌套StreamBuilderFutureBuilder 的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-20
        • 2019-11-22
        • 2016-03-26
        • 2011-04-13
        • 2019-08-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多