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 事件以添加去抖动的主要内容,如果未能解决你的问题,请参考以下文章

颤振:在 BLoC 中,事件比较失败,尽管使用 equatbale

颤振:如何使用“等待”等待其他 BLoC 事件完成

在颤振块中为(注销)功能添加单独的块

Flutter BLoC 事件竞争条件

颤振和块异步产量

颤振:BLoC Builder 未更新,尽管我在调试器中看到新的/不同的状态