从 Stream 获取当前值

Bam*_*oUA 7 dart flutter rxdart

有一个 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)
}
Run Code Online (Sandbox Code Playgroud)

集团:

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;
}
Run Code Online (Sandbox Code Playgroud)

为了实现我需要的东西,我创建了一些解决方法,但我不喜欢它,因为我认为我可以使用 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);
  }
}
Run Code Online (Sandbox Code Playgroud)

你能不能有人给我建议。我做错了什么?

cre*_*not 7

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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

void tapHandler() async {
  var lastCalcDate = bloc.currentDate;
  print(lastCalcDate);
  var newCalcDate = lastCalcDate.add(Duration(days:1));
  bloc.setDate(newCalcDate)
}
Run Code Online (Sandbox Code Playgroud)

  • 你好,请问如何在不使用 rx 的情况下获得它? (2认同)
  • 如果有人遇到同样的问题:rxdart 包中似乎有一个重大更改,您不能再在BehaviorSubject 上直接使用 .value 了。您必须使用“_dateSubject.valueWrapper.value”。此答案中指向 BeahviorSubject.value 文档的链接现在无效。 (2认同)