我正在寻找一种验证冻结模型的好方法。到目前为止,我想出了三种方法,如下面的代码片段所示。
@freezed
class Options with _$Options {
Options._();
factory Options._internal({required List<String> languages}) = _Options;
// #1: validation in factory constructor
factory Options({required List<String> languages}) {
if (languages.isEmpty) {
throw Exception('There must be at least one language.');
}
return Options._internal(languages: languages);
}
// #2: expose mutation methods with built-in validation
Options changeLanguages(List<String> languages) {
if (languages.isEmpty) {
throw Exception('There must be at least one language.');
}
return copyWith(languages: languages);
}
// #3: validation using custom properties
late final List<Exception> validationResult = <Exception>[
if (languages.isEmpty) Exception('There must be at least one language.'),
];
// #4: validation using a custom method
void validate() {
if (languages.isEmpty) {
throw Exception('There must be at least one language.');
}
}
}
#1:工厂构造函数中的验证。不幸的是,这只适用于新创建的对象,并且需要对copyWith
.
#2:变异方法中的验证。除了#1之外,这还可以用于在对象创建后运行验证,但仍然不适用于copyWith
.
#3:暴露带有验证错误的属性。到目前为止,这是我最喜欢的方法,尽管它要求模型的用户明确查找错误。
#4:#3的变体,它使用抛出方法而不是提供错误列表。
您对此有何看法?您是否知道任何更好的方法,或者是否有我忽略的包 API 的一部分?