我正在尝试找出最佳的方法来实现一个常数工厂,以生成定义模型的“空”实例,并保持其原始构造函数严格(没有默认参数就必须传入所有参数)。我找到的最接近的解决方案是使用具有相同参数集的联合类型和密封类。您可以参考Union types and Sealed classes。
因此,这将使我的主工厂严格,同时允许通过第二个工厂获取空实例。需要注意的重要事项是,我也不必在业务逻辑代码中匹配密封类(两个类中的所有参数都相同,因此我可以直接访问字段)。
有两个要点需要注意:
- 这仍然不够简洁。我必须重新定义所有参数并添加 @Default 装饰器。 - 您可以使用空工厂,但仍然可以传递自定义值,这是理想情况下我想避免的。我希望有一个不接受任何参数的空构造函数。
理想情况下,我希望它看起来像这样:
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,
}) = LoadedCosts;
const factory Costs.empty({
@Default(false) bool valid,
@Default('') String names,
@Default('') String prices,
@Default('') String subtotal,
@Default('') String deposit,
@Default('') String deliveryCosts,
@Default('') String total,
String? errCode,
}) = EmptyCosts;
因此,这将使我的主工厂严格,同时允许通过第二个工厂获取空实例。需要注意的重要事项是,我也不必在业务逻辑代码中匹配密封类(两个类中的所有参数都相同,因此我可以直接访问字段)。
有两个要点需要注意:
- 这仍然不够简洁。我必须重新定义所有参数并添加 @Default 装饰器。 - 您可以使用空工厂,但仍然可以传递自定义值,这是理想情况下我想避免的。我希望有一个不接受任何参数的空构造函数。
理想情况下,我希望它看起来像这样:
const Costs.empty()
: valid = false,
names = '',
prices = '',
subtotal = '',
deposit = '',
deliveryCosts = '',
total = '',
errCode = null;
如果您没有使用 freezed,这实际上是有效的。然而,使用 freezed,我需要重定向构造函数,这将带来所有问题。
有什么想法吗?