Flutter,BLoC是否需要使用rx dart?

7

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

然而,在社区中,有时候他们会说使用rx dart与BLoC更好。但我不明白为什么。我使用firestore作为后端,感觉完全不需要rxdart。即使我努力搜索了很久,也没有找到一个使用rx dart+BLoC的好样例项目。

如果你使用rx dart和BLoC,会有哪些好处呢?能看到一个例子吗?

2个回答

19

你把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设计模式实现。


8
如果您参考Felix Angelov创建的bloc包,则不一定需要使用rx_dart,但是您可以使用它。例如,您可以在transformEvents和/或transformTransitions上应用一些rx_dart运算符,例如switchMap、where、debounce、throttle等。这样,您可以操作到传递给bloc的事件(例如应用反压力,以避免向服务器发送太多请求而导致负载过重)。 Bloc生命周期 如果您想充分利用响应式流,则可以探索rx_bloc生态系统,这是业务逻辑组件模式的实现,支持rx_dart
基本上,您需要声明特定功能的合同,然后以反应方式实现与之兼容的 bloc。例如,如果您需要从 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;
}

现在当所有的合同都被定义好了,你需要实现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(),
          );
}

一旦你实现了你的业务逻辑,你可以使用 flutter_rx_bloc 在小部件树中访问 bloc。有很多 文章 和例子,你可以学习如何使用这个生态系统。


这是不准确的。Felix 的块包依赖于 rxdart。你可能不会自己使用运算符,但包仍然使用 rx。有人问 Felix 是否可能解除这种依赖关系,但他基本上说这不是优先事项(即永远不会完成)。 - Bitcoin Cash - ADA enthusiast
1
看起来RxDart在4.0.0版本中被移除为依赖项-https://github.com/felangel/bloc/blob/master/packages/bloc/CHANGELOG.md - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接