Flutter,BLoC 需要 rx dart 吗?

don*_*why 7 flutter bloc

在我见过的bloclibrary官方网站文档中,我从未见过他们使用过rx dart。

然而,有时在社区中,他们说一起使用 rx dart 会更好。但我不明白。我使用 firestore 作为后端,但我觉得我根本不需要 rxdart。尽管我努力搜索,但我无法看到使用 rx dart + BLoC 的良好示例项目。

如果将 rx dart 与 BLoC 一起使用有什么好处?我可以看一个例子吗?

Wil*_*son 20

您将 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;

}
Run Code Online (Sandbox Code Playgroud)

另一方面,Bloc 库是 BLoC 模式的实现。

它不仅提供了一种简单、统一且直观的 BLoC 模式实现方式,而且使您的应用程序非常易于测试和维护。

因此,要回答您的问题,您不需要 RxDart,除非您想自己实现 BLoC 模式。如果您使用 Bloc 库,那么您已经在使用 BloC 模式的 RxDart 免费实现。


小智 8

如果您引用Felix Angelov 创建的bloc包,您不一定需要使用rx_dart,但您可以。

例如,您可以在transformEvents和/或transformTransitions上应用一些rx_dart运算符,例如switchMap、where、debounce、throttle等。通过这种方式,您可以操纵传入块的事件(例如应用背压,这将避免服务器因太多请求而过载)

区块生命周期

如果您想充分利用反应流,您可以探索rx_bloc生态系统,它是包含rx_dart的业务逻辑组件模式的实现。

基本上,您需要声明特定功能的合同,然后实现以反应方式与其兼容的块。例如,如果您需要从 API 获取一些新闻,您需要以这种方式声明合约:

/// 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;
}
Run Code Online (Sandbox Code Playgroud)

现在定义了所有合约后,您需要实现 Reactive BloC

/// 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(),
          );
}
Run Code Online (Sandbox Code Playgroud)

实现业务逻辑后,您可以使用flutter_rx_bloc访问小部件树中的块。有大量的文章和示例,您可以在其中学习如何使用这个生态系统。