gpt4 book ai didi

dart - 如何使用 future 的值填充流?

转载 作者:IT王子 更新时间:2023-10-29 06:51:48 25 4
gpt4 key购买 nike

我正在使用流来监控我的 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);
}
}

我可以使用 rxdartstartWith提供初始值,但读出该值会导致 Future<int>我需要提供 intstartWith .

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> 的值,取这个值并将其插入 Subjectadd()功能。 _state 的所有听众- Subject将收到这些更新。

为什么使用 BehaviorSubject更容易?

作为解释为什么 BehaviorSubject使我们免于使用这种尴尬的解决方法 Future s(取自 RxJava 文档):

即使另一个订阅者迟到了,最近收到的项目也会被缓冲并正确交付。

关于dart - 如何使用 future 的值填充流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50951045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com