在blocklibrary官方网站文档中,我从未见过他们使用rx dart。
然而,在社区中,有时候他们会说使用rx dart与BLoC更好。但我不明白为什么。我使用firestore作为后端,感觉完全不需要rxdart。即使我努力搜索了很久,也没有找到一个使用rx dart+BLoC的好样例项目。
如果你使用rx dart和BLoC,会有哪些好处呢?能看到一个例子吗?
你把BLoC模式和Bloc库混淆了。
BLoC模式是由Google创建的一种响应式状态管理解决方案。它的目标是作为数据在你的应用程序中的中间人,例如在API和你的UI之间处理状态和业务逻辑。
它旨在具有平台无关性,这意味着在Bloc中相同的Dart代码将适用于像Flutter和Angular这样的框架。
通常使用RxDart,你可以像这样创建一个BLoC:
class AppDataBloc {
// The publish subject is responsible for get/add data and
// pass it to the UI as a stream.
final _appDataSubject = PublishSubject<AppData>();
// This is the stream the UI will use.
Observable<AppData> get appData => _appDataSubject.stream;
}
Bloc库则是BLoC设计模式的一种实现。
它不仅提供了一种简单、统一和直观的实现BLoC模式的方式,而且使您的应用程序极易进行测试和维护。
因此,回答您的问题,除非您想自己实现BLoC设计模式,否则您不需要使用RxDart。如果您使用Bloc库,则已经在使用一个无需RxDart的BLoC设计模式实现。
/// A contract, containing all News BloC incoming events
abstract class NewsBlocEvents {
/// Send a search event to the bloc with some payload
void search({required String query});
}
/// A contract, containing all News BloC states
abstract class NewsBlocStates {
/// The news found by the search query
///
/// It can be controlled by executing [NewsBlocStates.search]
///
Stream<Result<List<News>>> get news;
}
/// A BloC responsible for the news
@RxBloc()
class NewsBloc extends $NewsBloc {
/// The default constructor injecting a repository through DI
NewsBloc(this._repository);
/// The repository used for data source communication
final NewsRepository _repository;
/// Your events-to-sate business logic
@override
Stream<Result<List<News>>> _mapToNewsState() =>
_$searchEvent
/// Here you can apply any of the rx_dart operators
/// for instance, you can apply back pressure
.debounceTime(Duration(seconds: 1))
/// Then you get the data from the repository
.switchMap((_) =>
_repository.decrement().asResultStream(),
);
}
一旦你实现了你的业务逻辑,你可以使用 flutter_rx_bloc 在小部件树中访问 bloc。有很多 文章 和例子,你可以学习如何使用这个生态系统。