Flutter BLoC:Cubits 比 BLoC 更好吗?

Max*_*lov 6 state-management dart flutter bloc

我使用 Flutter 工作了很长时间,并发布了很多产品。我从来没有真正喜欢过 BLoC,更喜欢使用 Provider 或后来的 Riverpod。

我只是不明白该事件的概念。为什么我们还需要它?我很困惑,因为它的实际受欢迎程度...... BLoC 有 Cubit 子类,似乎使用起来更简单,但每个人都只是不停地说:“Cubit 更简单,但功能不那么强”。但有什么限制呢?

我什至认为肘尺更有用,同时也更简单:

  1. 使用 Cubit,您只需使用参数调用它的方法。如果需要,您仍然可以监听其状态并获取方法返回值。
  2. 您不需要额外的编码来实现这些事件类型。
  3. 您不需要额外的代码来实现 bloc 如何处理每种事件类型。方法就可以做到这一点。

示例:用户点击某些产品的“添加到购物车”按钮。

肘:

cartCubit.addProduct(productId);
Run Code Online (Sandbox Code Playgroud)

集团:

cartBloc.addEvent(UserAddsProductEvent(productId));
Run Code Online (Sandbox Code Playgroud)

在它们里面:

肘:

void addProduct(String productId) async {
   //some validation...
   if(...){...}
   final result = await cartRepo.addProduct(id);
   if(result == ...) {
      state = someState;
   //....
}
Run Code Online (Sandbox Code Playgroud)

集团:

void addEvent(CartEvent event) {
   if (event is UserAddsProductEvent) {
      _addProduct(event.productId)
      } else if (event is....) {
      //.....
      }
}

void _addProduct(String productId) async {
   //some validation...
   if(...){...}
   final result = await cartRepo.addProduct(id);
   if(result == ...) {
      state = someState;
   //....
}
Run Code Online (Sandbox Code Playgroud)

重点是什么?

ook*_*.kb 7

官方文档中有关于 Cubit 与 Bloc 的很好的概述。

简而言之,Cubit 的优势是简单性,而 Bloc 提供了更好的可追溯性先进的 ReactiveX 操作

在我们的项目中,我们在更简单的情况下使用 Cubit,如果逻辑更复杂并且一些“限制”实际上变得有用,则使用 Bloc:

  • 您只能发出新状态作为对事件的反应,因此实现更简单(但也更详细)。
  • 所有事件都被一一处理。同样,它使实施更加可靠且更易于维护。

另外,这可能是个人喜好的问题,但我喜欢 Bloc,因为它与 FSM 模式的紧密映射。在大多数情况下,应用程序状态可以很好地表示为状态机。即使使用白板,也可以更轻松地讨论实现,因为您可以仅显示具有多个状态和更改该状态的事件的方案。

如果您对 Cubit 感到满意,那么您可能不需要 Bloc。毕竟,主要目标是使架构易于理解和维护。


Kon*_*rev 3

集团

使用事件而不是直接方法调用的优点是,您可以在执行逻辑之前进行反跳/限制、缓冲流。

换句话说,您可以使用适用于事件逻辑的特殊方法。

肘节

如果您从 Cubit 开始一个新项目,它存在的原因是以后您将能够从 Cubit 迁移到 BLoC。

这意味着,如果在项目开始时您认为 BLoC 开销太大并且需要更简单的状态管理(没有事件、样板等),您可以选择 cubit 并以更少的努力迁移到 BLoC,而不是选择不同的状态管理解决方案,例如 MobX 或 Riverpod。

因此,对于 Cubit,您首先要实现状态和功能。稍后,如果您决定切换到 BLoC,则可以添加事件和 EventHandler。

您可以在这里阅读更多内容(官方文档):Cubit 与 BLoC