Flutter - 转换 flutter bloc 事件以添加去抖动

Suh*_*lar 2 dart flutter rxdart bloc flutter-bloc

我正在尝试使用 flutter bloc 制作一个无限列表。

我从这里参考:https : //github.com/felangel/bloc/blob/926029cae2d7614d38b5a9a8952e36bb59054b02/examples/github_search/common_github_search/lib/src/github_search_bloc/github_search_bloc.dart#L

根据这篇文章,要在两个事件之间添加延迟以便 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);
  }
Run Code Online (Sandbox Code Playgroud)

我面临的问题是 Observable 已被 RxDart 弃用,我不确定如何完成上述要求。

use*_*771 22

bloc8.0.0 开始,语法发生了变化,您需要将其作为转换器传递给函数on。除了去抖动之外,您还应该考虑并发性。要将顺序处理与去抖动结合起来,您可以提供以下函数:

import 'package:rxdart/rxdart.dart';
//...

    on<GithubSearchEvent>(
      (event, emit) {},
      transformer: (events, mapper) {
        return events.debounceTime(const Duration(milliseconds: 300)).asyncExpand(mapper);
      },
    );
Run Code Online (Sandbox Code Playgroud)

您可以创建一个可重用的变压器作为顶级函数,如下所示:

EventTransformer<Event> debounceSequential<Event>(Duration duration) {
  return (events, mapper) => events.debounceTime(duration).asyncExpand(mapper);
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

    on<GithubSearchEvent>(
      (event, emit) {},
      transformer: debounceSequential(const Duration(milliseconds: 300)),
    );
Run Code Online (Sandbox Code Playgroud)


Suh*_*lar 10

我找到了解决方案。

@override
  Stream<Transition< GithubSearchEvent, GithubSearchState >> transformEvents(
      Stream< GithubSearchEvent > events, transitionFn) {
    return events
        .debounceTime(const Duration(milliseconds: 300))
        .switchMap((transitionFn));
  }
Run Code Online (Sandbox Code Playgroud)

  • `EventTransformer` 已被弃用,我们如何使用 `onEvent` 来实现它? (4认同)
  • @Hamed,您可以将“transformer”传递给“on”函数。`bloc_concurrency` 包中有一些预定义的,但要消除反跳,您必须自己传递该函数。 (2认同)

小智 7

我无法向@user2220771 添加评论,因为我的声誉太低。

这是行不通的:

EventTransformer<Event> debounceTransformer<Event>(Duration duration) {
  return (events, mapper) => events.debounceTime(duration);
}
Run Code Online (Sandbox Code Playgroud)

你必须将地图切换为:

EventTransformer<Event> debounceTransformer<Event>(Duration duration) {
  return (events, mapper) {
    return events.debounceTime(duration).switchMap(mapper);
  };
}
Run Code Online (Sandbox Code Playgroud)