【问题标题】:BLoC search debounceBLoC 搜索去抖动
【发布时间】:2021-08-16 12:11:36
【问题描述】:

我有一个集团(一段代码)

    ...
  Stream<SearchState> _mapSearchSuggestionsEvent(SearchSuggestionsEvent event) async* {
    final results = await _searchApi.getSuggestions(event.query);
    yield SearchStateShowSuggestions(results);
  }
    ...

并尝试去抖动事件以避免过多的网络调用

  @override
  Stream<Transition<SearchEvent, SearchState>> transformEvents(
      Stream<SearchEvent> events, TransitionFunction<SearchEvent, SearchState> transitionFn) {
    return events.debounceTime(Duration(milliseconds: 1000)).asyncExpand(transitionFn);
  }

我还在 _searchApi.getSuggestions 方法中添加了日志。

我在日志中看到的内容:

I/flutter ( 4838): ???? [SearchApi] : getSuggestions
I/flutter ( 4838): ???? [SearchApi] : getSuggestions k
I/flutter ( 4838): ???? [SearchApi] : getSuggestions kr
I/flutter ( 4838): ???? [SearchApi] : getSuggestions kre
I/flutter ( 4838): ???? [SearchApi] : getSuggestions krev
I/flutter ( 4838): ???? [SearchApi] : getSuggestions kreve

等等……

添加事件:

_textEditingController.addListener(() {
      _bloc.add(SearchSuggestionsEvent(_textEditingController.text));
    });

也许我不明白,但为什么我在使用 debounce 时呼叫没有跳过?

【问题讨论】:

  • @pskink 每次查询发生变化时我都会调用add

标签: flutter dart bloc


【解决方案1】:

这是来自官方文档的代码示例:

@override
Stream<Transition<PostEvent, PostState>> transformEvents(
  Stream<PostEvent> events,
  TransitionFunction<PostEvent, PostState> transitionFn,
) {
  return super.transformEvents(
    events.debounceTime(const Duration(milliseconds: 500)),
    transitionFn,
  );
}

请仔细检查这是否适用于您的情况。不确定,但也许asyncExpand 只是延迟了您的事件,但它们并没有被跳过,这意味着您仍然会为每个输入更改发送请求。来源:https://bloclibrary.dev/#/flutterinfinitelisttutorial

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-03-01
  • 2020-03-19
  • 1970-01-01
  • 2018-05-15
  • 2020-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多