我正在使用流来监控我的 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);
}
}
我可以使用 rxdart
的 startWith
提供初始值,但读出该值会导致 Future<int>
我需要提供 int
至 startWith
.
static Future<int> f = Firestore.instance
.collection('ServerData')
.document('serverStatus')
.get()
.then((doc) => doc['activeUsers'] as int);
以后我会这样使用它:
StreamBuilder(
stream: _visitorCount,
initialData: 0,
builder: (context, snapshot) =>
Text('${snapshot.data} users logged in') ...
我提供0
作为初始值,但这当然只是一个临时值。
我敢肯定这很明显,但我仍然很难做到正确。
解决此问题的最佳方法是什么?
最佳答案
事实证明,我需要解决的问题并不需要我将 future 的一些值添加到流中以弥补遗漏的值。我只需要使用 BehaviorSubject
正如 Remi Rousselet 所指出的那样。
但为了完整起见:这里是您如何从 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));
}
调用 addFromFuture
我可以查询一些将导致 Future<int>
的值,取这个值并将其插入 Subject
与 add()
功能。 _state
的所有听众- Subject
将收到这些更新。
为什么使用 BehaviorSubject
更容易?
作为解释为什么 BehaviorSubject
使我们免于使用这种尴尬的解决方法 Future
s(取自 RxJava 文档):
即使另一个订阅者迟到了,最近收到的项目也会被缓冲并正确交付。
关于dart - 如何使用 future 的值填充流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50951045/