【发布时间】:2019-08-04 09:04:49
【问题描述】:
为简单起见,假设我有两个屏幕:
StoriesListScreenStoryDetailsScreen
为了填充StoriesListScreen,我使用Stream从Firestore获取一些数据:
Stream<QuerySnapshot> getFirstTenStories() {
return _firestore.collection('stories').limit(10).snapshots();
}
然后我在StoriesListScreen 中的StreamBuilder 中使用这个Stream,并将它包含的文档映射到一些Story 对象。然后我使用ListView.builder 创建一些StoriesListTile 对象,将Story 对象作为参数,以便它们可以呈现列表中的每个对象。
所以一切都很好......
但是当用户点击StoriesListTile 时,我想打开StoryDetailsScreen 并显示该特定Story 对象的详细信息。
由于此时Story对象存在并且已经传入StoriesListTile对象,我可以很容易地将这个Story对象传入StoryDetailsScreen:
Navigator.of(context).push(MaterialPageRoute(builder: (context) => StoryDetailsScreen(_story));
所以它工作正常,但是......
我希望能够听到用于创建 Story 对象的数据的任何变化。
目前,如果我在 Firestore 中的数据发生更改,那么我在 StoriesListScreen 中的列表将自动更新,因为它使用了 Stream<QuerySnapshot>。
我想在StoryDetailsScreen 中做同样的事情,但我传递给StoryDetailsScreen 屏幕的不是Stream,而是一个不会更新的Story 对象。
一种解决方案可能是从 Firestore 获取此故事数据,并在 StreamBuilder 中使用 Stream<DocumentSnapshot> StoryDetailsScreen,因此如果数据发生更改,它将自动更新。但这意味着浪费另一个 Firestore 读取,因为我已经有了这些数据。
那么如何将特定文档的Stream<DocumentSnapshot> 传递给我的StoryDetailsScreen?是否可以从我已有的Stream<QuerySnapshot> 中提取它?
【问题讨论】:
标签: flutter dart google-cloud-firestore snapshot