Flutter Freezed中实现无参空实例常量工厂的最优方案?
在Freezed中实现无参数常量空实例工厂的最优方案
需求回顾
要在Freezed模型中实现两个核心要求:
- 主构造器保持严格性:所有必填参数无默认值,调用时必须传入全部参数
- 提供无参数的常量工厂创建空实例,且不允许传入自定义值
之前使用联合类型的方案存在重复定义参数、空工厂可传值的问题,下面是更优的解决思路:
最优实现方案
利用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; }
方案优势
- 简洁性:无需重复定义参数或添加
@Default装饰器,所有空值逻辑由Freezed自动生成 - 严格性:主构造器仍保持必填要求,调用
Costs()时必须传入全部参数;Costs.empty()无参数,无法传入自定义值 - 常量支持:
Costs.empty()是完全的常量构造器,可用于const上下文(如const数组、const Widget属性) - 无密封类匹配成本:所有实例均为同一
_Costs类型,业务逻辑中可直接访问字段,无需处理联合类型的分支匹配
注意事项
运行flutter pub run build_runner build生成代码后,Freezed会自动为_Costs.empty构造器填充预设的空值(valid: false、所有字符串字段为''、errCode: null),无需手动维护。
内容的提问来源于stack exchange,提问作者Roman Shirokov
相关产品推荐
相关产品推荐

