从 Stream 获取当前值

Posted

技术标签:

【中文标题】从 Stream 获取当前值【英文标题】:Getting current value from Stream 【发布时间】:2019-09-08 21:19:56 【问题描述】:

有一个 StreamBuilder(使用 RxDart)显示一些日期。单击 InkWell 小部件后,我需要在旧日期的基础上计算新日期。下面的代码简单地解释了算法,但是当我运行它时,没有任何反应,并且在下划线行之后执行停止,即我从来没有看到 lastCalcDate 的值。

图形界面:

child: StreamBuilder(
  stream: bloc.getDate,
  builder: (context,snapshot) 
    return InkWell(
      onTap: () => tapHandler
    );
),

void tapHandler() async 
  var lastCalcDate = await bloc.getDate.single;
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  print(lastCalcDate);
  var newCalcDate = lastCalcDate.add(Duration(days:1));
  bloc.setDate(newCalcDate)

BLoC:

class Bloc 
  // BehaviourSubject is usedto be sure that last sent date will be accessible in `tapHandler`.
  final _dateSubject = BehaviourSubject<DateTime>(); 
  Observable<DateTime> get getDate => _dateSubject.stream;
  Function(DateTime) get setDate => _dateSubject.add;

为了实现我需要的东西,我创建了一些解决方法,但我不喜欢它,因为我认为我可以使用 observables 做同样的事情。

BLoC(解决方法):

class Bloc 
  final _dateSubject = BehaviourSubject<DateTime>(); 
  Observable<DateTime> get getDate => _dateSubject.stream;
  DateTime _date;
  void setDateWorkaround(DateTime date) 
    _date = date;
    _dateSubject.add(date);
  

有人能给我建议吗?我做错了什么?

【问题讨论】:

【参考方案1】:

single 将不起作用,因为它将返回流中的下一个项目,但是必须先添加该项目。这意味着single 只会等待下一个项目,在你的情况下它不会发生。

由于您已经在使用rxdartBehaviorSubject,您可以像这样轻松访问当前元素:

class Bloc 
  final _dateSubject = BehaviourSubject<DateTime>(); 
  Observable<DateTime> get getDate => _dateSubject.stream;
  Function(DateTime) get setDate => _dateSubject.add;

  DateTime get currentDate => _dateSubject.value;

在这种情况下,我正在使用BehaviorSubject.value,这实际上是该类的重点。

现在,您可以在点击处理程序中使用currentDate

void tapHandler() async 
  var lastCalcDate = bloc.currentDate;
  print(lastCalcDate);
  var newCalcDate = lastCalcDate.add(Duration(days:1));
  bloc.setDate(newCalcDate)

【讨论】:

你好,不使用rx如何获取? 如果有人遇到同样的问题:rxdart 包中似乎有一个重大变化,您不能再在 BehaviorSubject 上直接使用 .value 了。您必须使用“_dateSubject.valueWrapper.value”。此答案中 BeahviorSubject.value 文档的链接现在无效。

以上是关于从 Stream 获取当前值的主要内容,如果未能解决你的问题,请参考以下文章

从Hashmap的所有值中获取所有嵌套项

list中是map,stream如何拿到key集合

c语言fgetc()函数(从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动)

如何使用 rxdart 获取 Stream<String> 中的最后一个值?

从 SQL Server SEQUENCE 获取当前值

Flutter-如何在没有 RxDart 的情况下从 Stream<String> 获取最后一个值?