You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 15:45:34