Flutter:Firebase身份验证和Firestore快照流

时间:2018-12-17 13:52:37

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

在我的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中?

3 个答案:

答案 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) {...}
    );
}

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

答案 1 :(得分:1)

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 :(得分:0)

您可以在Material App上方使用StreamProvider,使用Provider.of将auth User提供给您的任何小部件,然后在单独的类调用AuthStateChaged中使用。这会将auth User从登录状态变为null,再到未自动登录状态。然后,您可以根据需要围绕您的应用程序的用户。