oli*_*ver 2 reactive-programming dart flutter google-cloud-firestore
我正在使用流来监控我的Firestore后端的变化。这适用于更新,但我没有得到初始值。
class A {
final Stream<DocumentSnapshot> _visitorCount =
Firestore.instance.document('ServerData/serverStatus').snapshots();
Stream<int> get visitorCount {
return Observable(_visitorCount)
.map((DocumentSnapshot doc) => doc['activeUsers'] as int);
}
}
Run Code Online (Sandbox Code Playgroud)
我可以使用rxdart
'sstartWith
来提供一个初始值,但是读出这个值会导致 aFuture<int>
并且我需要提供一个int
to startWith
。
static Future<int> f = Firestore.instance
.collection('ServerData')
.document('serverStatus')
.get()
.then((doc) => doc['activeUsers'] as int);
Run Code Online (Sandbox Code Playgroud)
在路上,我像这样使用它:
StreamBuilder(
stream: _visitorCount,
initialData: 0,
builder: (context, snapshot) =>
Text('${snapshot.data} users logged in') ...
Run Code Online (Sandbox Code Playgroud)
我提供0
初始值,但这当然只是一个临时值。我相信这很明显,但我仍然很难做到正确。解决这个问题的最佳方法是什么?
事实证明,我需要解决的问题并不需要我将一些来自未来的值添加到流中以弥补缺失的值。我所需要的只是使用BehaviorSubject
Remi Rousselet 指出的a 。但为了完整起见:以下是您从 a 中获取值Future
并将其推送到流中的方法:
Future
到流中class A {
Subject<int> _stateSubject;
Subject<int> _state;
Subject<int> get state {
return _state;
}
A() {
_stateSubject = new BehaviorSubject();
_state = _stateSubject;
Firestore.instance
.document('ServerData/serverStatus')
.snapshots()
.map((DocumentSnapshot doc) => doc['activeUsers'] as int)
.listen((int value) {
_stateSubject.add(value);
});
}
Future<int> get visitorCount => Firestore.instance
.document('ServerData/serverStatus')
.get()
.then((DocumentSnapshot d) => d.data['activeUsers']);
void addFromFuture() => visitorCount.then((int v) => _state.add(v + 1));
}
Run Code Online (Sandbox Code Playgroud)
通过调用,addFromFuture
我可以查询一些将导致 a 的Future<int>
值,获取该值并将其推送到Subject
withadd()
函数中。所有听众的_state
-Subject
将获得这些更新。
BehaviorSubject
更容易?作为解释为什么BehaviorSubject
让我们免于使用这种尴尬的解决方法Future
s (取自RxJava文档):
即使另一个订阅者迟到了,最近收到的项目也会被缓冲并正确传递。
归档时间: |
|
查看次数: |
2574 次 |
最近记录: |