第一种方式是使用 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();
}
}
总的来说,这两种方式在功能上是等价的,你可以根据自己的喜好和项目的需求来选择使用哪一种。