Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 验证冻结的模型类_Flutter_Validation_Dart_Freezed - Fatal编程技术网

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(数据);
}

在这种情况下,根本无法创建错误的实例。

断言仅用于调试目的非常好,但我正在寻找一种解决方案,允许抛出面向用户的异常。谢谢你!虽然我喜欢这个解决方案,但我正在寻找一种方法来表达使用冻结包构建的数据类的这种行为。据我所知,目前没有办法做到这一点