Flutter Firestore 如何监听对一个文档的更改

Jar*_*red 7 dart firebase flutter google-cloud-firestore

我只想在 ONE 文档更改或更新时收到通知。每个获取更新的示例总是使用集合。我试图只使用一个文档来实现它,但它永远不会得到任何更新。这是我现在所拥有的不起作用的东西:

@override
Widget build(BuildContext context) {
StreamBuilder<DocumentSnapshot>(
    stream: Firestore.instance
        .collection("users")
        .document(widget.uid)
        .snapshots(),
    builder:
        (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
      user = snapshot.data.data as User;
    });
Run Code Online (Sandbox Code Playgroud)

我已经调试了 100 次,但它永远不会进入“builder:”部分。顺便说一下,这不是文档引用的问题。我在这里做错了什么?

Axe*_*nds 12

这是一个例子

Firestore.instance
        .collection('Users')
        .document(widget.uid)
        .snapshots()
        .listen((DocumentSnapshot documentSnapshot) {

      Map<String, dynamic> firestoreInfo = documentSnapshot.data;

      setState(() {

        money = firestoreInfo['earnings'];

      });

    })
        .onError((e) => print(e));
Run Code Online (Sandbox Code Playgroud)

但你做错的是在这里:

(BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
      user = snapshot.data.data as User;
    });
Run Code Online (Sandbox Code Playgroud)

将其替换为

(BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
      var firestoreData = snapshot.data;

      String info = firestoreData['info'];
    });
Run Code Online (Sandbox Code Playgroud)


小智 8

这是我的经验并且工作得很好。(具有BLoC模式的StreamBUilder)。

Step1 => 按查询和限制过滤

var userQuery = Firestore.instance
          .collection('tbl_users')
          .where('id', isEqualTo: id)
          .limit(1);
Run Code Online (Sandbox Code Playgroud)

步骤2 => 听力

userQuery.snapshots().listen((data) {
            data.documentChanges.forEach((change) {
              print('documentChanges ${change.document.data}');
            });
          });
Run Code Online (Sandbox Code Playgroud)

集团

class HomeBloc {
  final userSc = StreamController<UserEntity>(); 

  Future doGetProfileFireStore() async {
    await SharedPreferencesHelper.getUserId().then((id) async {
      print('$this SharedPreferencesHelper.getUserId() ${id}');
      var userQuery = Firestore.instance
          .collection('tbl_users')
          .where('id', isEqualTo: id)
          .limit(1);
      await userQuery.getDocuments().then((data) {
        print('$this userQuery.getDocuments()');
        if (data.documents.length > 0) {
          print('$this data found');
          userQuery.snapshots().listen((data) {
            data.documentChanges.forEach((change) {
              print('documentChanges ${change.document.data}');
              userSc.sink.add(new UserEntity.fromSnapshot(data.documents[0]));
            });
          });
        } else {
          print('$this data not found');
        }
      });
    });
  }

  void dispose() {
    userSc.close();
  } 
}
Run Code Online (Sandbox Code Playgroud)

看法

new StreamBuilder(
        stream: bloc.userSc.stream,
        builder: (BuildContext context, AsyncSnapshot<UserEntity> user) {
          return new Center(
            child: new Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                user.hasData
                    ? new Container(
                        width: 80,
                        height: 80,
                        decoration: new BoxDecoration(
                          borderRadius: BorderRadius.circular(100.0),
                          image: new DecorationImage(
                            image: NetworkImage(user.data.photo),
                            fit: BoxFit.cover,
                          ),
                        ),
                      )
                    : new Container(
                        width: 50,
                        height: 50,
                        child: new CircularProgressIndicator(
                          strokeWidth: 2,
                          valueColor:
                              AlwaysStoppedAnimation<Color>(ColorsConst.base),
                        ),
                      ),
                new Container(
                  margin: EdgeInsets.fromLTRB(10, 0, 0, 0),
                  child: new Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    crossAxisAlignment: CrossAxisAlignment.center,
                    children: <Widget>[
                      new Text(
                        user.hasData
                            ? '${user.data.username.toUpperCase()}'
                            : 'loading',
                        style: TextStyleConst.b16(
                            color: Colors.black
                                .withOpacity(user.hasData ? 1.0 : 0.2),
                            letterSpacing: 2),
                      ),
                      new Container(
                        margin: EdgeInsets.all(5),
                      ),
                      new Text(
                        user.hasData ? '${user.data.bio}' : 'loading',
                        style: TextStyleConst.n14(
                            color: Colors.black
                                .withOpacity(user.hasData ? 1.0 : 0.2)),
                      ),
                      new Container(
                        margin: EdgeInsets.fromLTRB(0, 10, 0, 0),
                        padding: EdgeInsets.all(10),
                        decoration: new BoxDecoration(
                          color: Colors.blue,
                          borderRadius: BorderRadius.circular(100.0),
                        ),
                        child: new Row(
                          mainAxisAlignment: MainAxisAlignment.spaceBetween,
                          children: <Widget>[
                            new Row(
                              children: <Widget>[
                                new Icon(
                                  Icons.trending_up,
                                  color: Colors.white,
                                  size: 20,
                                ),
                                new Text(
                                  '145K',
                                  style:
                                      TextStyleConst.b14(color: Colors.white),
                                ),
                              ],
                            ),
                            new Container(
                              margin: EdgeInsets.fromLTRB(10, 0, 10, 0),
                            ),
                            new Row(
                              children: <Widget>[
                                new Icon(
                                  Icons.trending_down,
                                  color: Colors.white,
                                  size: 20,
                                ),
                                new Text(
                                  '17',
                                  style:
                                      TextStyleConst.b14(color: Colors.white),
                                ),
                              ],
                            ),
                          ],
                        ),
                      ),
                    ],
                  ),
                ),
              ],
            ),
          );
        },
      ),
Run Code Online (Sandbox Code Playgroud)