从 Stream 获取当前值
Getting current value from Stream
有一个显示日期的 StreamBuilder(使用 RxDart)。单击 InkWell 小部件后,我需要根据旧日期计算新日期。下面的代码简单地解释了算法但是当我 运行 它没有任何反应并且执行在带下划线的行之后停止,即我从未看到 lastCalcDate.[=13= 的值]
图形用户界面:
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)
}
区块链:
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);
}
}
你能不能给我点建议。我做错了什么?
single
将不起作用,因为它将 return 流中的下一个项目,但是,必须先添加它。这意味着 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
,这实际上是 class 的全部要点。
现在,您只需在点击处理程序中使用 currentDate
:
void tapHandler() async {
var lastCalcDate = bloc.currentDate;
print(lastCalcDate);
var newCalcDate = lastCalcDate.add(Duration(days:1));
bloc.setDate(newCalcDate)
}
使用 provider
中的 StreamProvider
Listen to a Stream and expose the latest value emitted.
有一个显示日期的 StreamBuilder(使用 RxDart)。单击 InkWell 小部件后,我需要根据旧日期计算新日期。下面的代码简单地解释了算法但是当我 运行 它没有任何反应并且执行在带下划线的行之后停止,即我从未看到 lastCalcDate.[=13= 的值]
图形用户界面:
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)
}
区块链:
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);
}
}
你能不能给我点建议。我做错了什么?
single
将不起作用,因为它将 return 流中的下一个项目,但是,必须先添加它。这意味着 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
,这实际上是 class 的全部要点。
现在,您只需在点击处理程序中使用 currentDate
:
void tapHandler() async {
var lastCalcDate = bloc.currentDate;
print(lastCalcDate);
var newCalcDate = lastCalcDate.add(Duration(days:1));
bloc.setDate(newCalcDate)
}
使用 provider
中的StreamProvider
Listen to a Stream and expose the latest value emitted.