我可以使用StreamBuilder在Firestore中听一个文档吗?

时间:2019-06-08 18:44:45

标签: firebase flutter dart google-cloud-firestore

我试图在一个集合的单个文档中侦听更改,但是我无法使其正常工作。

Widget build(BuildContext context) {
  return StreamBuilder(
    stream: Firestore.instance.collection("events").document(widget.documentID).get().asStream(),
    ...
  }
}

我正在使用 .asStream()方法,但是我只得到一次文档。如果我在Firebase控制台中更改数据,除非重新打开视图,否则什么都不会更新。

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:6)

之所以只获取一次文档,是因为DocumentReference.get方法最初仅返回一个Future,而使用asStream仅返回一个 一个 FutureStream

然而,cloud_firestore程序包具有一种内置的方法,可以正确侦听文档。
您可以改用DocumentReference.snapshots,它返回该文档每次更改的Stream

在您的代码中,您只需将.get().asStream()替换为.snapshots()

答案 1 :(得分:0)

如果您想获得单个文档,请使用 Future builder 而不是 Stream Builder。

FutureBuilder<DocumentSnapshot>(
                                              future: Firestore.instance
                                                  .collection('users')
                                                  .document(widget.puid)
                                                  .get(),
                                              builder: (context,
                                                  AsyncSnapshot<
                                                          DocumentSnapshot>
                                                      snapshot) {
                                                if (snapshot.hasError)
                                                  return Center(
                                                    child: Text(snapshot
                                                        .hasError
                                                        .toString()),
                                                  );
                                                return snapshot.hasData
                                                    ? Text(
                                                        "${snapshot.data['username']}",
                                                        style: TextStyle(
                                                            color:
                                                                kPrimaryColor,
                                                            fontSize: 18,
                                                            fontWeight:
                                                                FontWeight
                                                                    .bold),
                                                      )
                                                    : Container();
                                              },
                                            ),