在我的flutter应用程序中,我正在使用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来构建传递uid的UI,以获取DocumentSnapshot。
所以这是我的问题:是否有更好的方法来实现这一目标,并避免将StreamBuilder嵌套在FutureBuilder中?
答案 0 :(得分:1)
您可以制作一个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
的方法。
答案 1 :(得分:1)
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 :(得分:0)
您可以在Material App上方使用StreamProvider,使用Provider.of将auth User提供给您的任何小部件,然后在单独的类调用AuthStateChaged中使用。这会将auth User从登录状态变为null,再到未自动登录状态。然后,您可以根据需要围绕您的应用程序的用户。