Flutter:显示来自经过身份验证的 Firebase Auth 用户的带有 StreamBuilder 的一些 Firestore 集合

Posted

技术标签:

【中文标题】Flutter:显示来自经过身份验证的 Firebase Auth 用户的带有 StreamBuilder 的一些 Firestore 集合【英文标题】:Flutter: Shows some Firestore Collection with a StreamBuilder from an authenticated Firebase Auth User 【发布时间】:2019-08-01 18:24:49 【问题描述】:

我的应用有一组卡片,我需要将一些汽车添加到收藏夹列表中,我希望每个用户都有自己的收藏夹。

所以我做了经典的 StreamBuilder 示例以在 Flutter 上显示一些列表:

StreamBuilder<QuerySnapshot>(
    stream: getCars()

如果getCars()函数是这样的话,一切正常:

getCars() 
   return Firestore.instance
    .collection("users")
    .document("oT646MvXXXXXXXXXXXjlN8L1V2")
    .collection("cars").snapshots();

假设“oT646MvXXXXXXXXXXXjlN8L1V2”是 FirebaseUser uid。

但是如何动态读取 FirebaseUser uid 以返回集合?

我尝试了这段代码,但没有成功,因为它返回了一个 Future:

getCarsError() 异步 FirebaseUser fUser = 等待 FirebaseAuth.instance.currentUser();

return Firestore.instance
    .collection("users")
    .document(fUser.uid)
    .collection("cars").snapshots();

我怎样才能完成呢?

谢谢

【问题讨论】:

@KENdi 你能确保修复所有标签吗?这个问题是关于 Firestore 而不是实时数据库。 【参考方案1】:

好的,想法是创建一个流(我使用 rxDart 库,但你可以不使用它)

BehaviorSubject<Car> _carController = BehaviorSubject<Car>();
Function(Car) get pushCar => _carController.sink.add;
Stream<Car> get streamCar => _carController ;
...
StreamBuilder<Car>(
    stream: streamCar

然后在你的异步函数中:

void getCars() async
   FirebaseUser fUser = await FirebaseAuth.instance.currentUser();
   Firestore.instance
    .collection("users")
    .document(fUser.uid)
    .collection("cars").getDocuments().then((querySnapshot)
      for (document in querySnapshot.documents)
        pushCar(Car.fromJson(document.data));                //Deserialize your car here
    ).catchError((e)=>print(e));                            //Do what you want to handle error

因此,您将您的汽车异步推送到您的信息流中,然后您只需获取 stream&lt;Car&gt; 并打印您需要的内容 :)

希望对你有帮助!!

【讨论】:

我没有提到document Id 默认不等于FirebaseUser uid。我假设你强迫 id 等于 uid,如果你不这样做,那显然是行不通的。 谢谢你,Ferdi,我试试看。

以上是关于Flutter:显示来自经过身份验证的 Firebase Auth 用户的带有 StreamBuilder 的一些 Firestore 集合的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Firebase - 未能正确删除经过 Google 身份验证的用户

带有 WebView 的 Flutter 应用中的 Firebase 身份验证

来自 laravel 会话登录的经过身份验证的 api 调用。可能吗?

在 Flutter 中使用 StreamProvider 4.0.1 从 Firebase 监控身份验证状态

如何在 Flutter 手机身份验证中删除验证码

来自已经过身份验证的帐户的Firebase createUserWithEmailAndPassword()