Flutter - 转换 flutter bloc 事件以添加去抖动
Flutter - Transform flutter bloc event to add debounce
我正在尝试使用 flutter bloc 制作一个无限列表。
根据此 post,要在两个事件之间添加延迟以使 api 不会被发送垃圾邮件,您需要覆盖 transformEvents
并向这样的事件添加去抖动:
@override
Stream<GithubSearchState> transformEvents(
Stream<GithubSearchEvent> events,
Stream<GithubSearchState> Function(GithubSearchEvent event) next,
) {
return (events as Observable<GithubSearchEvent>)
.debounceTime(
Duration(milliseconds: 300),
)
.switchMap(next);
}
我面临的问题是 Observable 已被 RxDart 弃用,我不确定如何实现上述要求。
我找到了解决方案。
@override
Stream<Transition< GithubSearchEvent, GithubSearchState >> transformEvents(
Stream< GithubSearchEvent > events, transitionFn) {
return events
.debounceTime(const Duration(milliseconds: 300))
.switchMap((transitionFn));
}
从 bloc
8.0.0 开始,语法发生了变化,您需要将其作为转换器传递给 on
函数。除了去抖动,你还应该考虑 concurrency。要将顺序处理与去抖动相结合,您可以提供以下功能:
import 'package:rxdart/rxdart.dart';
//...
on<GithubSearchEvent>(
(event, emit) {},
transformer: (events, mapper) {
return events.debounceTime(const Duration(milliseconds: 300)).asyncExpand(mapper);
},
);
您可以像这样创建一个可重用的转换器作为顶级函数:
EventTransformer<Event> debounceSequential<Event>(Duration duration) {
return (events, mapper) => events.debounceTime(duration).asyncExpand(mapper);
}
并像这样使用它:
on<GithubSearchEvent>(
(event, emit) {},
transformer: debounceSequential(const Duration(milliseconds: 300)),
);
我无法向@user2220771 添加评论,因为我的声誉太低了。
这行不通:
EventTransformer<Event> debounceTransformer<Event>(Duration duration) {
return (events, mapper) => events.debounceTime(duration);
}
您必须将地图切换为:
EventTransformer<Event> debounceTransformer<Event>(Duration duration) {
return (events, mapper) {
return events.debounceTime(duration).switchMap(mapper);
};
}
我正在尝试使用 flutter bloc 制作一个无限列表。
根据此 post,要在两个事件之间添加延迟以使 api 不会被发送垃圾邮件,您需要覆盖 transformEvents
并向这样的事件添加去抖动:
@override
Stream<GithubSearchState> transformEvents(
Stream<GithubSearchEvent> events,
Stream<GithubSearchState> Function(GithubSearchEvent event) next,
) {
return (events as Observable<GithubSearchEvent>)
.debounceTime(
Duration(milliseconds: 300),
)
.switchMap(next);
}
我面临的问题是 Observable 已被 RxDart 弃用,我不确定如何实现上述要求。
我找到了解决方案。
@override
Stream<Transition< GithubSearchEvent, GithubSearchState >> transformEvents(
Stream< GithubSearchEvent > events, transitionFn) {
return events
.debounceTime(const Duration(milliseconds: 300))
.switchMap((transitionFn));
}
从 bloc
8.0.0 开始,语法发生了变化,您需要将其作为转换器传递给 on
函数。除了去抖动,你还应该考虑 concurrency。要将顺序处理与去抖动相结合,您可以提供以下功能:
import 'package:rxdart/rxdart.dart';
//...
on<GithubSearchEvent>(
(event, emit) {},
transformer: (events, mapper) {
return events.debounceTime(const Duration(milliseconds: 300)).asyncExpand(mapper);
},
);
您可以像这样创建一个可重用的转换器作为顶级函数:
EventTransformer<Event> debounceSequential<Event>(Duration duration) {
return (events, mapper) => events.debounceTime(duration).asyncExpand(mapper);
}
并像这样使用它:
on<GithubSearchEvent>(
(event, emit) {},
transformer: debounceSequential(const Duration(milliseconds: 300)),
);
我无法向@user2220771 添加评论,因为我的声誉太低了。
这行不通:
EventTransformer<Event> debounceTransformer<Event>(Duration duration) {
return (events, mapper) => events.debounceTime(duration);
}
您必须将地图切换为:
EventTransformer<Event> debounceTransformer<Event>(Duration duration) {
return (events, mapper) {
return events.debounceTime(duration).switchMap(mapper);
};
}