将Stream Building与特定的Firestore文档一起使用

时间:2018-06-10 22:19:15

标签: google-cloud-firestore flutter

我正在构建一个Flutter应用程序,我无法理解如何实现Firestore。在我看过的教程中,我只看到如何创建整个集合的快照,但在我的情况下,我的集合是用户,所以我只需要对特定用户的文档进行快照。 Firebase文档似乎没有关于如何执行此操作的文档,也没有关于FlutterFire GitHub页面的大量文档。请帮忙!

这是我尝试使用StreamBuilder构建的Widget。

  @override
  Widget build(BuildContext context) {
    return new StreamBuilder(
      stream: Firestore.instance.collection('users').document(userId).snapshots(),
      builder: (context, snapshot) {
        return new ListView.builder(
          itemCount: //what do I put here?,
          itemBuilder: (context, index) => new Item(//And here?),
        );
      }
    );
  }

2 个答案:

答案 0 :(得分:7)

假设您要使用文档中的name参数创建Text

Widget build(BuildContext context) {
  return new StreamBuilder(
      stream: Firestore.instance.collection('users').document(userId).snapshots(),
      builder: (context, snapshot) {
        if (!snapshot.hasData) {
          return new Text("Loading");
        }
        var userDocument = snapshot.data;
        return new Text(userDocument["name"]);
      }
  );
}

这只是一个例子。每次更改文档本身时,在文档上创建StreamBuilder都会自行重建。您可以尝试此代码,然后转到控制台并更改“名称”值。您的应用会自动反映更改。

您可以构建使用流中数据的整个树,而不只是一个Text

如果您想获得文档的当前值,可以通过解析文档引用的Future get()方法来实现。

var document = await Firestore.instance.collection('users').document(userId).get(),

答案 1 :(得分:1)

每个元素都应在代码的后面强制转换为引用。

  return new StreamBuilder<DocumentSnapshot>(
      stream: Firestore.instance.collection('users').document(userId).snapshots(), //returns a Stream<DocumentSnapshot>
      builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
        if (!snapshot.hasData) {
          return new Text("Loading");
        }
        var userDocument = snapshot.data;
        return new Text(userDocument["name"]);
      }
  );
}