Cubit Basic、Cubit Equatable与Cubit Freezed的区别是什么?
Cubit Basic、Equatable Cubit、Freezed Cubit的差异与特性
1. Cubit Basic
这是Cubit最基础的实现方式,状态可以是任意类型,但默认采用引用对比判断状态是否变化。也就是说,哪怕两个状态的内容完全一致,只要是不同的实例,Cubit就会判定状态更新,触发UI重建。
- 适用场景:状态逻辑极简单(比如单个布尔值、整数),或者你需要手动控制状态更新时机的时候。
- 代码示例:
class CounterCubit extends Cubit<int> { CounterCubit() : super(0); void increment() => emit(state + 1); }
如果状态是自定义类,就容易出现无意义的重建:
class User { final String name; User(this.name); } class UserCubit extends Cubit<User> { UserCubit() : super(User('Alice')); void updateName() { // 即使名字没变化,新实例也会触发UI更新 emit(User('Alice')); } }
2. Cubit Equatable
借助equatable包实现内容对比,你需要让状态类继承Equatable,并通过props方法指定用来对比的属性。只有当这些属性的内容真正变化时,Cubit才会触发状态更新和UI重建,避免无意义的渲染。
- 适用场景:状态是自定义类,需要避免不必要的UI重建,同时不想手动编写
equals和hashCode方法。 - 代码示例:
import 'package:equatable/equatable.dart'; class User extends Equatable { final String name; User(this.name); @override List<Object?> get props => [name]; } class UserCubit extends Cubit<User> { UserCubit() : super(User('Alice')); void updateName(String newName) { // 只有newName和当前name不同时,才会触发更新 emit(User(newName)); } }
3. Cubit Freezed
基于freezed包生成不可变状态类,自动实现内容对比、copyWith方法、toString等功能。它还支持密封类(sealed class)特性,能轻松处理多分支状态(比如网络请求的加载中、成功、失败)。
- 适用场景:状态结构复杂、需要不可变性,或者需要处理多种状态分支的场景,能大幅提升开发效率。
- 代码示例:
import 'package:freezed_annotation/freezed_annotation.dart'; part 'user_state.freezed.dart'; @freezed class UserState with _$UserState { const factory UserState.initial() = _Initial; const factory UserState.loading() = _Loading; const factory UserState.success(String name) = _Success; const factory UserState.error(String message) = _Error; } class UserCubit extends Cubit<UserState> { UserCubit() : super(const UserState.initial()); void fetchUser() async { emit(const UserState.loading()); try { await Future.delayed(const Duration(seconds: 1)); emit(const UserState.success('Bob')); } catch (e) { emit(const UserState.error('Failed to fetch user')); } } }
Freezed自动生成的copyWith方法可以快速修改状态:
// 从Success状态修改用户名 final newState = state.copyWith(name: 'Charlie');
同时密封类特性让你在UI中用when安全处理所有状态分支,不会遗漏情况。
一句话总结
- Cubit Basic:最基础,适合简单状态,但可能触发无意义重建;
- Cubit Equatable:解决内容对比问题,手动指定对比属性,适合中等复杂度的单一状态;
- Cubit Freezed:自动生成不可变状态,支持多分支场景,开发效率最高。
内容的提问来源于stack exchange,提问作者user20393696
相关产品推荐
相关产品推荐

