第一种方式是使用 on<Event> 方法。这是 Bloc 库 7.0 版本引入的新特性,它允许你为每种事件类型定义一个单独的处理器。这种方式的优点是代码更简洁,更易于阅读和维护,因为每种事件的处理逻辑都被清晰地分离出来了。

SearchBloc() : super(SearchInitial()) {
  on<SearchQueryChanged>((event, emit) {
    emit(SearchLoading());
    // final results = _searchService.search(event.query);
    // emit(SearchSuccess(results));
  });

  on<SearchSubmitted>((event, emit) {
    emit(SearchLoading());
    // final results = _searchService.search(event.query);
    // emit(SearchSuccess(results));
  });

  on<SearchCleared>((event, emit) {
    emit(SearchInitial());
  });
}

第二种方式是使用 mapEventToState 方法。这是 Bloc 库早期版本的写法,所有的事件处理逻辑都在这个方法中实现。你需要在这个方法中检查事件的类型,并根据不同的事件类型执行不同的逻辑。这种方式的缺点是当事件类型很多时,mapEventToState 方法可能会变得很长,不易于阅读和维护。

  @override
  Stream<SearchState> mapEventToState(SearchEvent event) async* {
    // TODO: Implement event to state mapping logic here
    if (event is SearchQueryChanged) {
      yield SearchLoading();
      // final results = _searchService.search(event.query);
      // yield SearchSuccess(results);
    } else if (event is SearchSubmitted) {
      yield SearchLoading();
      // final results = _searchService.search(event.query);
      // yield SearchSuccess(results);
    } else if (event is SearchCleared) {
      yield SearchInitial();
    }
  }

总的来说,这两种方式在功能上是等价的,你可以根据自己的喜好和项目的需求来选择使用哪一种。

最后修改:2024 年 05 月 03 日
如果觉得我的文章对你有用,请随意赞赏