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

Flutter中如何正确初始化Either Right为空值?解决常量报错问题

解决Dart中Either对象的初始化问题

问题核心

你遇到的矛盾点在于:Dart要求可选参数的默认值必须是常量,但担心用const Right([])后无法后续将状态更新为Left类型。实际上这个顾虑是不必要的——const仅作用于初始状态的默认值,后续Bloc更新状态时,完全可以生成新的JobListState实例,将jobListSections赋值为Left类型。

正确初始化代码

修改代码,给默认值添加const关键字以满足Dart的常量要求,同时不影响后续状态更新:

class JobListState extends Equatable {
  const JobListState({
    this.status = JobListStatus.initial,
    this.jobListSections = const Right([]), // 添加const关键字
    this.filter,
  });

  final JobListStatus status;
  final Either<Failure, List<JobListViewmodel?>> jobListSections;
  final JobListFilter? filter;

  // 必须重写Equatable的props方法以保证状态对比正确性
  @override
  List<Object?> get props => [status, jobListSections, filter];
}

后续状态更新示例

在Bloc的事件处理逻辑中,你可以正常生成包含Left状态的新JobListState,完全不受初始默认值的const限制:

// 示例:请求失败时,emit带有Left状态的新状态
emit(
  JobListState(
    status: JobListStatus.failure,
    jobListSections: Left(Failure('加载失败')),
    filter: state.filter,
  ),
);

关键说明

  • const Right([])只是初始状态的默认值,它不会限制后续创建新JobListState实例时使用非const的Left或Right对象。
  • Dart强制要求可选命名参数的默认值为编译时常量,因此必须添加const关键字才能消除编译错误。

内容的提问来源于stack exchange,提问作者w461

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:05:20