dart 从Stream获取当前值

nuypyhwy  于 2023-10-13  发布在  其他
关注(0)|答案(2)|浏览(132)

有一个StreamBuilder(使用RxDart)显示一些日期。点击InkWell小部件后,我需要在旧的基础上计算一个新的日期。下面的代码只是简单地解释了算法,但是当我运行它时,什么也没有发生,执行在下划线行之后停止,即。我从未看到lastCalcDate的值。
GUI:

  1. child: StreamBuilder(
  2. stream: bloc.getDate,
  3. builder: (context,snapshot) {
  4. return InkWell(
  5. onTap: () => tapHandler
  6. );
  7. }),
  8. void tapHandler() async {
  9. var lastCalcDate = await bloc.getDate.single;
  10. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  11. print(lastCalcDate);
  12. var newCalcDate = lastCalcDate.add(Duration(days:1));
  13. bloc.setDate(newCalcDate)
  14. }

BLoC:

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

为了实现我需要的东西,我创建了一些变通方法,但我不喜欢它,因为我认为我可以使用可观的东西做同样的事情。
BLoC(变通方法):

  1. class Bloc {
  2. final _dateSubject = BehaviourSubject<DateTime>();
  3. Observable<DateTime> get getDate => _dateSubject.stream;
  4. DateTime _date;
  5. void setDateWorkaround(DateTime date) {
  6. _date = date;
  7. _dateSubject.add(date);
  8. }
  9. }

你能不能找个人给我给予。我做错了什么?

rm5edbpk

rm5edbpk1#

single将不工作,因为它将返回流中的下一个项目,但是,必须首先添加。这意味着single将等待下一个项目,在您的情况下,它不会发生。
因为你已经在使用rxdartBehaviorSubject了,你可以很容易地像这样访问当前元素:

  1. class Bloc {
  2. final _dateSubject = BehaviourSubject<DateTime>();
  3. Observable<DateTime> get getDate => _dateSubject.stream;
  4. Function(DateTime) get setDate => _dateSubject.add;
  5. DateTime get currentDate => _dateSubject.value;
  6. }

在本例中,我使用了BehaviorSubject.value,这实际上是该类的全部意义。
现在,你可以在tap处理程序中使用currentDate

  1. void tapHandler() async {
  2. var lastCalcDate = bloc.currentDate;
  3. print(lastCalcDate);
  4. var newCalcDate = lastCalcDate.add(Duration(days:1));
  5. bloc.setDate(newCalcDate)
  6. }
展开查看全部
yuvru6vn

yuvru6vn2#

provider使用StreamProvider
监听一个Stream并公开最新发出的值。

相关问题