Flutter BLoC:Cubits 比 BLoC 更好吗?
Flutter BLoC: Are Cubits better then BLoC?
我使用 Flutter 已经很长时间了,并且发布了很多产品。我从来都不喜欢 BLoC,更喜欢使用 Provider 或后来的 Riverpod。
我只是不明白那个事件的概念。为什么我们还需要它?而且我很困惑,因为它的实际受欢迎程度...... BLoC 有 Cubit 子类,它似乎更易于使用,但每个人都一直在说:“Cubit 更简单,但功能不多”。但限制是什么?
我什至认为 Cubits 同时更实用和更简单:
- 对于 Cubit,您只需使用参数调用它的方法。您仍然可以监听它的状态并在需要时获取方法 return 值。
- 您不需要额外的编码来实现这些事件类型。
- 您不需要额外的代码来实现 bloc 将如何处理每个事件类型。方法做得很好。
示例:
用户点击某些产品的“添加到购物车”按钮。
肘:
cartCubit.addProduct(productId);
区块链:
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;
//....
}
有什么意义?
中对 Cubit 与 Bloc 进行了很好的概述
简而言之,Cubit 的优势是简单,而 Bloc 提供更好的可追溯性和高级 ReactiveX 操作.
在我们的项目中,我们将 Cubit 用于更简单的情况,如果逻辑更复杂并且一些“限制”实际上变得有用,则使用 Bloc:
- 您只能发出一个新状态作为对事件的反应,因此实现更直接(但也更冗长)。
- 所有事件一一处理。同样,它使实现更可靠且更易于维护。
此外,这可能是个人喜好问题,但我喜欢 Bloc,因为它与 FSM 模式的映射很紧密。在大多数情况下,应用程序状态可以很好地表示为状态机。即使使用白板也可以更轻松地讨论实现,因为您可以只显示具有多个状态和更改该状态的事件的方案。
如果您对 Cubit 感到满意,那么您可能不需要 Bloc。毕竟,主要目标是使架构易于理解和维护。
BLoC
使用事件而不是直接方法调用的优点是您可以debounce/throttle,在执行逻辑之前缓冲流。
换句话说,您可以使用适用于事件逻辑的特殊方法。
肘
如果你从 Cubit 开始一个新项目,它存在的原因是以后你将能够从 Cubit 迁移到 BLoC。
这意味着如果在项目开始时您认为 BLoC 的开销太大并且您需要更简单的状态管理(没有事件、样板等),您可以选择 cubit 并以更少的努力迁移到 BLoC,与选择不同的状态管理解决方案(如 MobX 或 Riverpod)相比。
所以对于 Cubit,您首先要实现状态和功能。稍后,如果您决定切换到 BLoC,您可以添加事件和 EventHandler。
您可以在这里阅读更多内容(官方文档):Cubit vs BLoC
我使用 Flutter 已经很长时间了,并且发布了很多产品。我从来都不喜欢 BLoC,更喜欢使用 Provider 或后来的 Riverpod。
我只是不明白那个事件的概念。为什么我们还需要它?而且我很困惑,因为它的实际受欢迎程度...... BLoC 有 Cubit 子类,它似乎更易于使用,但每个人都一直在说:“Cubit 更简单,但功能不多”。但限制是什么?
我什至认为 Cubits 同时更实用和更简单:
- 对于 Cubit,您只需使用参数调用它的方法。您仍然可以监听它的状态并在需要时获取方法 return 值。
- 您不需要额外的编码来实现这些事件类型。
- 您不需要额外的代码来实现 bloc 将如何处理每个事件类型。方法做得很好。
示例: 用户点击某些产品的“添加到购物车”按钮。
肘:
cartCubit.addProduct(productId);
区块链:
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;
//....
}
有什么意义?
简而言之,Cubit 的优势是简单,而 Bloc 提供更好的可追溯性和高级 ReactiveX 操作.
在我们的项目中,我们将 Cubit 用于更简单的情况,如果逻辑更复杂并且一些“限制”实际上变得有用,则使用 Bloc:
- 您只能发出一个新状态作为对事件的反应,因此实现更直接(但也更冗长)。
- 所有事件一一处理。同样,它使实现更可靠且更易于维护。
此外,这可能是个人喜好问题,但我喜欢 Bloc,因为它与 FSM 模式的映射很紧密。在大多数情况下,应用程序状态可以很好地表示为状态机。即使使用白板也可以更轻松地讨论实现,因为您可以只显示具有多个状态和更改该状态的事件的方案。
如果您对 Cubit 感到满意,那么您可能不需要 Bloc。毕竟,主要目标是使架构易于理解和维护。
BLoC
使用事件而不是直接方法调用的优点是您可以debounce/throttle,在执行逻辑之前缓冲流。
换句话说,您可以使用适用于事件逻辑的特殊方法。
肘
如果你从 Cubit 开始一个新项目,它存在的原因是以后你将能够从 Cubit 迁移到 BLoC。
这意味着如果在项目开始时您认为 BLoC 的开销太大并且您需要更简单的状态管理(没有事件、样板等),您可以选择 cubit 并以更少的努力迁移到 BLoC,与选择不同的状态管理解决方案(如 MobX 或 Riverpod)相比。
所以对于 Cubit,您首先要实现状态和功能。稍后,如果您决定切换到 BLoC,您可以添加事件和 EventHandler。
您可以在这里阅读更多内容(官方文档):Cubit vs BLoC