Flutter BLoC:Cubits 比 BLoC 好吗?

Posted

技术标签:

【中文标题】Flutter BLoC:Cubits 比 BLoC 好吗?【英文标题】:Flutter BLoC: Are Cubits better then BLoC? 【发布时间】:2021-08-20 02:14:05 【问题描述】:

我与 Flutter 合作了很长时间,并且有很多已发布的产品。我从来没有真正喜欢过 BLoC,而是更喜欢使用 Provider 或更高版本的 Riverpod。

我只是不明白那个事件的概念。为什么我们还需要它?而且我很困惑,因为它的实际受欢迎程度...... BLoC 的 Cubit 子类似乎更易于使用,但每个人都一直在说:“Cubit 更简单,但不是那么实用”。但什么是限制?

我什至认为 Cubits 同时更有用也更简单:

    使用 Cubit,您只需使用参数调用它的方法。如果需要,您仍然可以监听其状态并获取方法返回值。 您不需要额外的代码来实现这些事件类型。 您不需要额外的代码来实现 bloc 如何处理每个事件类型。方法做得很好。

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

肘:

cartCubit.addProduct(productId);

BLoC:

cartBloc.addEvent(UserAddsProductEvent(productId));

在他们里面:

肘:

void addProduct(String productId) async 
   //some validation...
   if(...)...
   final result = await cartRepo.addProduct(id);
   if(result == ...) 
      state = someState;
   //....

集团:

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;
   //....

重点是什么?

【问题讨论】:

【参考方案1】:

BLoC

使用事件而不是直接方法调用的优点是您可以在执行逻辑之前对流进行去抖动/节流、缓冲。

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

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

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

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

您可以在此处阅读更多内容(官方文档):Cubit vs BLoC

【讨论】:

【参考方案2】:

official documentation 中有一个很好的 Cubit vs Bloc 概述。

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

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

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

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

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

【讨论】:

以上是关于Flutter BLoC:Cubits 比 BLoC 好吗?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 状态管理 | StreamBuild 局部刷新的效果Flutter局部刷新

Flutter MultiBlocProvider 性能

Flutter Bloc 不会改变 TextFormField 的初始值

谁能说出 Flutter 中“flutter_bloc”和“bloc”包的区别

不在yaml文件flutter中安装包bloc或flutter bloc

Flutter:BLoC 包 - bloc 提供者