Flutter - 转换颤振 bloc 事件以添加去抖动
Posted
技术标签:
【中文标题】Flutter - 转换颤振 bloc 事件以添加去抖动【英文标题】:Flutter - Transform flutter bloc event to add debounce 【发布时间】:2020-11-08 08:48:56 【问题描述】:我正在尝试使用颤振块制作一个无限列表。
我从这里参考了:https://github.com/felangel/bloc/blob/926029cae2d7614d38b5a9a8952e36bb59054b02/examples/github_search/common_github_search/lib/src/github_search_bloc/github_search_bloc.dart#L15
根据这篇文章,要在两个事件之间添加延迟以便 api 不会收到垃圾邮件,您需要覆盖 transformEvents
并为这样的事件添加 debounce:
@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 弃用,我不确定如何完成上述要求。
【问题讨论】:
【参考方案1】:我找到了解决办法。
@override
Stream<Transition< GithubSearchEvent, GithubSearchState >> transformEvents(
Stream< GithubSearchEvent > events, transitionFn)
return events
.debounceTime(const Duration(milliseconds: 300))
.switchMap((transitionFn));
【讨论】:
如果发送太频繁,这可能会跳过事件?EventTransformer
已被弃用,我们如何使用onEvent
实现这一点?
@Hamed 你可以将transformer
传递给on
函数。 bloc_concurrency
包中有一些预定义的,但要消除抖动,您必须自己传递函数。【参考方案2】:
自bloc
8.0.0 以来,语法略有变化,您需要将其作为转换器传递给on
函数:
import 'package:rxdart/rxdart.dart';
//...
on<GithubSearchEvent>(
(event, emit) ,
transformer: (events, mapper)
return events.debounceTime(const Duration(milliseconds: 300));
,
);
您可以像这样创建一个可重用的转换器作为***函数:
EventTransformer<Event> debounceTransformer<Event>(Duration duration)
return (events, mapper) => events.debounceTime(duration);
并像这样使用它:
on<GithubSearchEvent>(
(event, emit) ,
transformer: debounceTransformer(Duration(milliseconds: 300)),
);
【讨论】:
以上是关于Flutter - 转换颤振 bloc 事件以添加去抖动的主要内容,如果未能解决你的问题,请参考以下文章