如何使用未来的值填充流?

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>并且我需要提供一个intto 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初始值,但这当然只是一个临时值。我相信这很明显,但我仍然很难做到正确。解决这个问题的最佳方法是什么?

oli*_*ver 5

事实证明,我需要解决的问题并不需要我将一些来自未来的值添加到流中以弥补缺失的值。我所需要的只是使用BehaviorSubjectRemi Rousselet 指出的a 。但为了完整起见:以下是您从 a 中获取值Future并将其推送到流中的方法:

将 a 中的值插入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>值,获取该值并将其推送到Subjectwithadd()函数中。所有听众的_state-Subject将获得这些更新。

为什么使用BehaviorSubject更容易?

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

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