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

Flutter Freezed中实现无参空实例常量工厂的最优方案?

在Freezed中实现无参数常量空实例工厂的最优方案

需求回顾

要在Freezed模型中实现两个核心要求:

  1. 主构造器保持严格性:所有必填参数无默认值,调用时必须传入全部参数
  2. 提供无参数的常量工厂创建空实例,且不允许传入自定义值

之前使用联合类型的方案存在重复定义参数、空工厂可传值的问题,下面是更优的解决思路:

最优实现方案

利用Freezed的重定向构造器特性,直接给主构造器绑定一个无参数的空实例工厂,无需重复定义参数,且完全符合常量要求:

import 'package:freezed_annotation/freezed_annotation.dart';

part 'costs.freezed.dart';

@freezed
class Costs with _$Costs {
  // 主构造器:严格要求所有必填参数,无默认值,保证调用时必须传入全部参数
  const factory Costs({
    required bool valid,
    required String names,
    required String prices,
    required String subtotal,
    required String deposit,
    required String deliveryCosts,
    required String total,
    String? errCode,
  }) = _Costs;

  // 无参数的常量空实例工厂:重定向到主构造器,自动传入预设空值
  const factory Costs.empty() = _Costs.empty;
}

方案优势

  1. 简洁性:无需重复定义参数或添加@Default装饰器,所有空值逻辑由Freezed自动生成
  2. 严格性:主构造器仍保持必填要求,调用Costs()时必须传入全部参数;Costs.empty()无参数,无法传入自定义值
  3. 常量支持:Costs.empty()是完全的常量构造器,可用于const上下文(如const数组、const Widget属性)
  4. 无密封类匹配成本:所有实例均为同一_Costs类型,业务逻辑中可直接访问字段,无需处理联合类型的分支匹配

注意事项

运行flutter pub run build_runner build生成代码后,Freezed会自动为_Costs.empty构造器填充预设的空值(valid: false、所有字符串字段为''、errCode: null),无需手动维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:35:36