【发布时间】:2021-04-05 11:58:46
【问题描述】:
我正在寻找一种验证freezed 模型的好方法。到目前为止,我想出了三种方法,如下面的 sn-p 所示。
@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 的一部分?
【问题讨论】:
标签: flutter validation dart freezed