首页 > 解决方案 > Flutter:Firebase 身份验证和 Firestore 快照流

问题描述

在我的颤振应用程序中,我使用 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 中?

标签: firebasedartfluttergoogle-cloud-firestorebloc

解决方案


更新: 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


推荐阅读