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

标签 dart google-cloud-firestore flutter reactive-programming

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

相关文章:

datetime - Dart -两个不同的日期在天中产生相同的差异

android - 类似SQL的Firestore中的联接

flutter - 保持 firesotrore 集合离线可用并在前台同步

firebase - 云函数 : check if document exists always return exists

flutter - Flutter APK构建Android资源链接失败的振动包

dart - 如何获取当前小部件的偏移量

dart - 如何使用新的 js 0.6.0 包将 Dart 类映射到 JS "class"?

JSON 关联数组到 Dart/Flutter 对象

dart - 如何从树中删除小部件

flutter - Dart HTTP软件包在内置APK中不起作用