Flutter:Firebase 身份验证和 Firestore 快照流
Posted
技术标签:
【中文标题】Flutter:Firebase 身份验证和 Firestore 快照流【英文标题】:Flutter: Firebase auth and Firestore snapshot stream 【发布时间】: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 身份验证与 Bloc/Cubit 集成的最佳和最简洁的方法 flutter-developer.medium.com/… 【参考方案1】:更新:
firebase.uid()
现在是同步而不是异步,因为 0.18.0
。所以你可以直接在你的信息流中使用它。
旧答案:
RxDart 是您所需要的,您可以将Future
和Stream
组合起来,然后再将它们传递给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) ...
);
这是我避免嵌套StreamBuilder
或FutureBuilder
的方法。
【讨论】:
以上是关于Flutter:Firebase 身份验证和 Firestore 快照流的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Flutter 和 Firebase 设置 Facebook 身份验证
Flutter bloc 和 Firebase 电话身份验证
Flutter 设备预览和 Firebase 身份验证不兼容
成功身份验证后,Flutter Firebase 数据库权限被拒绝