有一个(使用RxDart的) StreamBuilder,它显示一些日期。单击InkWell小部件后,我需要在旧日期的基础上计算一个新日期。下面的代码简单地解释了算法,但当我运行它时,什么也没有发生,执行在带下划线的行后停止,即我永远看不到lastCalcDate的值。
GUI:
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;
}
为了实现我需要的东西,我创建了一些变通方法,但我不喜欢它,因为我填充我可以使用可观察对象做同样的事情。
BLoC (解决方法):
class Bloc {
final _dateSubject = BehaviourSubject<DateTime>();
Observable<DateTime> get getDate => _dateSubject.stream;
DateTime _date;
void setDateWorkaround(DateTime date) {
_date = date;
_dateSubject.add(date);
}
}
你能找个人给我提个建议吗?我做错了什么?
发布于 2019-04-19 03:02:58
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)
}
https://stackoverflow.com/questions/55747684
复制相似问题