Firestore snapshots.map(_transform)在StreamBuilder中没有数据

时间:2018-11-17 04:26:42

标签: firebase flutter google-cloud-firestore

我有一个使用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<QuerySnapshot>有数据(hasData返回true)。

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

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

1 个答案:

答案 0 :(得分:0)

问题似乎与snapshot()立即发送数据有关。我设法创建一个包装Firestore集合的类来解决这个问题。

此包装器具有自己的StreamController<T>,其中T是我要返回的非Firestore数据类型(跨多个后端实现抽象)。

包装程序将在构造时侦听必要的Firestore快照。最新快照结果被缓存。然后,我的StreamBuilder可以同时使用内部StreamController.stream和缓存的快照数据进行构造。

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

这暂时有效,但是具有无限期连续听snapshots的副作用。我将必须更新包装程序,以在不需要(无订阅者)时停止监听快照,并在有新订阅者时重新监听,或者仅使用快照流的映射。