我有一个使用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也什么也不返回?
答案 0 :(得分:0)
问题似乎与snapshot()
立即发送数据有关。我设法创建一个包装Firestore集合的类来解决这个问题。
此包装器具有自己的StreamController<T>
,其中T是我要返回的非Firestore数据类型(跨多个后端实现抽象)。
包装程序将在构造时侦听必要的Firestore快照。最新快照结果被缓存。然后,我的StreamBuilder
可以同时使用内部StreamController.stream
和缓存的快照数据进行构造。
StreamBuilder(
stream: _wrapper.stream,
initialData: _wrapper.latestData,
)
这暂时有效,但是具有无限期连续听snapshots
的副作用。我将必须更新包装程序,以在不需要(无订阅者)时停止监听快照,并在有新订阅者时重新监听,或者仅使用快照流的映射。