Flutter 验证冻结的模型类
我正在寻找一种验证模型的好方法。到目前为止,我提出了三种方法,如下所示Flutter 验证冻结的模型类,flutter,validation,dart,freezed,Flutter,Validation,Dart,Freezed,我正在寻找一种验证模型的好方法。到目前为止,我提出了三种方法,如下所示 @冻结 使用$Options初始化选项{ 选项; 工厂选项。_内部({所需列表语言})=\u选项; //#1:在工厂构造函数中进行验证 工厂选项({必需的列表语言}){ if(语言.isEmpty){ 抛出异常('必须至少有一种语言'); } 返回选项。\u内部(语言:语言); } //#2:使用内置验证公开突变方法 选项更改语言(列表语言){ if(语言.isEmpty){ 抛出异常('必须至少有一种语言'); } 返回c
@冻结
使用$Options初始化选项{
选项;
工厂选项。_内部({所需列表语言})=\u选项;
//#1:在工厂构造函数中进行验证
工厂选项({必需的列表语言}){
if(语言.isEmpty){
抛出异常('必须至少有一种语言');
}
返回选项。\u内部(语言:语言);
}
//#2:使用内置验证公开突变方法
选项更改语言(列表语言){
if(语言.isEmpty){
抛出异常('必须至少有一种语言');
}
返回copyWith(语言:语言);
}
//#3:使用自定义属性进行验证
后期最终列表验证结果=[
if(languages.isEmpty)异常('必须至少有一种语言'),
];
//#4:使用自定义方法进行验证
void validate(){
if(语言.isEmpty){
抛出异常('必须至少有一种语言');
}
}
}
#1:工厂构造函数内部的验证。不幸的是,这只适用于新创建的对象,并且需要进一步更改copyWith
#2:突变方法内部的验证。除了#1之外,还可以使用它在对象创建后运行验证,但对于copyWith
,它仍然不起作用
#3:公开带有验证错误的属性。到目前为止,这是我最喜欢的方法,尽管它要求模型的用户显式地查找错误
#4:#3的变体,它使用抛出方法而不是提供错误列表
你对此有何看法?您知道更好的方法吗?或者包API中是否有我忽略的部分?冻结了对中的自定义
断言的新增支持:。将这些应用于您的示例会产生以下结果:
@冻结
带有$Options的抽象类选项{
选项;
@Assert('languages.isNotEmpty','必须至少有一种语言')
工厂选项({必需的列表语言})=\u选项;
}
但是,这不允许抛出任意异常,并且assert
s仅包含在调试版本中,而不包含在概要文件/发布版本中。我可能会将验证移到下面一步。您可以创建模型语言列表
:
类语言列表{
语言列表(this.data){
if(data.isEmpty)抛出ArgumentError('提供至少一个元素');
}
最终清单数据;
@凌驾
bool操作符==(Object other)=>other是LanguageList&&listQuality.equals(data,other.data);
@凌驾
int get hashCode=>DeepCollectionEquality().hash(数据);
}
并在选项中使用它
型号:
工厂选项。_内部({required LanguageList languages})=\u选项;
通过使非法状态不可表示,而不是在运行时抛出错误,您甚至可以使其更加“编译友好”:
类语言列表{
LanguageList(字符串头,Iterable尾):数据=[head,…tail];
最终清单数据;
@凌驾
bool操作符==(Object other)=>other是LanguageList&&listQuality.equals(data,other.data);
@凌驾
int get hashCode=>DeepCollectionEquality().hash(数据);
}
在这种情况下,根本无法创建错误的实例。断言仅用于调试目的非常好,但我正在寻找一种解决方案,允许抛出面向用户的异常。谢谢你!虽然我喜欢这个解决方案,但我正在寻找一种方法来表达使用冻结包构建的数据类的这种行为。据我所知,目前没有办法做到这一点