【问题标题】:Firestore snapshots.map(_transform) has no data in StreamBuilderFirestore snapshots.map(_transform) 在 StreamBuilder 中没有数据
【发布时间】:2019-04-20 06:04:18
【问题描述】:

我有一个使用 Cloud Firestore 的 Flutter 项目。在我的一个小部件中,我有一个 StreamBuilder,可以理想地从数据库中读取快照。理论上,我用于从远程服务器读取的 API 应该足够抽象,可以将 Firestore 换成不同的实现。

class Database {
  Stream<QuerySnapshot> get snapshots => Firestore.instance.collection('entires').snapshots();

  Stream<List<String>> get entries => snapshots.map((snapshot) => snapshot.documents.map((document) => document.data['name']).toList());
}

如果我的 StreamBuilder 使用 snapshots,则 AsyncSnapshot&lt;QuerySnapshot&gt; 有数据(hasData 返回 true)。

如果我的 StreamBuilder 使用entries,那么AsyncSnapshot&lt;List&lt;String&gt;&gt; 将永远不会有数据(hasData 返回 false)---即使我成功打印出数据是什么(我的返回结果是填充的字符串列表) .

我希望我的Database 界面不受 Firestore 的影响。所以,我的问题是:为什么即使我有数据,StreamBuilder 的 AsyncSnapshot 也不返回任何内容?

【问题讨论】:

    标签: firebase flutter google-cloud-firestore


    【解决方案1】:

    问题似乎围绕snapshot() 立即发送数据。我设法通过创建一个包装我的 Firestore 集合的类来解决问题。

    这个包装器有自己的StreamController&lt;T&gt;,其中 T 是我想要返回的非 Firestore(跨多个后端实现的抽象)数据类型。

    包装器将在构建时侦听必要的 Firestore 快照。最新的快照结果被缓存。然后我的StreamBuilder 可以同时使用内部的StreamController.stream 和缓存的快照数据来构建它。

    StreamBuilder(
      stream: _wrapper.stream,
      initialData: _wrapper.latestData,
    )
    

    这暂时有效,但会产生无限期持续收听snapshots 的副作用。我必须更新我的包装器以在不需要时停止监听快照(没有订阅者),并在有新订阅者时重新监听,或者只是使用快照流的映射。

    【讨论】:

      猜你喜欢
      • 2021-02-20
      • 2020-02-14
      • 2023-01-16
      • 2020-05-19
      • 2021-03-03
      • 2022-11-17
      • 2021-07-01
      • 2021-02-07
      • 2021-07-26
      相关资源
      最近更新 更多