Flutter-如何使子窗口小部件可以访问变量

时间:2020-01-24 10:47:03

标签: flutter

我创建了一个名为FirestoreStreamBuilder的StatelessWidget,该StatelessWidget创建一个Stream并返回一个子代。

class FirestoreStreamBuilder extends StatelessWidget {

  FirestoreStreamBuilder({@required this.collectionReference, @required this.child, @required this.noDataChild});

  final String collectionReference;
  final Widget child;
  final Widget noDataChild;

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
      stream: Firestore.instance.collection(collectionReference).snapshots() ,
      builder: (context, snapshot) {
        if (!snapshot.hasData) return noDataChild;
        return child;
      },
    );
  }
}

我需要使snapshot可以访问child。我该怎么办?

示例:

FirestoreStreamBuilder(
          collectionReference: 'collection',
          child: Text('I want to acces to snapshot here $snapshot'), //How can I access snapshot from here?
          noDataChild: Container(),
        )

1 个答案:

答案 0 :(得分:1)

创建自定义回调

typedef OnDataReceived = void Function(DocumentSnapShot);//or your return type

    class FirestoreStreamBuilder extends StatelessWidget {

      FirestoreStreamBuilder({@required this.collectionReference, @required this.child, 
      @required this.noDataChild, @required this.onDataReceived});

      final String collectionReference;
      final Widget child;
      final Widget noDataChild;
      final OnDataReceived onDataReceived;

      @override
      Widget build(BuildContext context) {
        return StreamBuilder<QuerySnapshot>(
          stream: Firestore.instance.collection(collectionReference).snapshots() ,
          builder: (context, snapshot) {
            if (!snapshot.hasData) {
                 onDataReceived(snapshot);
                 return noDataChild;
            }
            return child;
          },
        );
      }
    }

访问小部件中的快照

FirestoreStreamBuilder(
      collectionReference: 'collection',
      child: Text('Hurray you got snapshot !'),
      noDataChild: Container(),
      onDataReceived:(snapshot){
         //TODO your task with snapshot
     }
    )