从 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
只会等待下一个项目,在你的情况下它不会发生。
由于您已经在使用rxdart
和BehaviorSubject
,您可以像这样轻松访问当前元素:
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 获取当前值的主要内容,如果未能解决你的问题,请参考以下文章
c语言fgetc()函数(从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动)