在 Freezed 中,是否可以从现有的冻结数据类创建联合案例

Abh*_*ran 7 dart flutter flutter-web dartz

我正在使用冻结包来创建我的 json 解析器和数据类。到目前为止,我正在使用dartz的包来创建 Union 案例并在 Flutter 小部件中处理它们。例如,我的一些 Union 类如下所示。

Either<ApiFailure,ModelA> apiResult1;
Either<ApiFailure,ModelB> apiResult2;
Run Code Online (Sandbox Code Playgroud)

我在我的颤振小部件的构建器中使用它们,方法是折叠它们并为每种情况返回特定的小部件。例如。

return apiResul1.fold<Widget>(
  (left) => ErrorWidget(),
  (right) => SuccessWidget(),
);
Run Code Online (Sandbox Code Playgroud)

我使用冻结包创建了ApiFailureModelAModelB作为数据类。我知道冻结带有类似的联合类支持,例如 dartz,我们可以在其中定义联合案例。因此,我尝试按如下方式使用它们,并且根据我的初步理解,使用现有的数据类无法实现以下目标,例如。ModelA andApiFailure`。

@freezed
abstract class ApiResult1 with _$ApiResult1{
  const factory ApiResult1.modelA() =  ModelA;
  const factory ApiResult1.apiFailure() =  ApiFailure;
}

@freezed
abstract class ApiResult2 with _$ApiResult1{
  const factory ApiResult2.modelB() =  ModelB;
  const factory ApiResult2.apiFailure() =  ApiFailure;
}

Run Code Online (Sandbox Code Playgroud)

请注意,在上述两个工会班我重新定义ApiFailureApiResult2这正是我想避免的。

问题:是否可以利用现有的数据类来构建联合类,这样我就不必为了更改ApiFailure对象的结构而进行多次更改。希望我的问题很清楚。

小智 0

为什么不使用您的数据类作为参数?

@freezed
abstract class ApiResult1 with _$ApiResult1 {
  const factory ApiResult1.model(ModelA model) = _ModelA;
  const factory ApiResult1.failure(ApiFailure failure) = _ApiFailure1;
}

@freezed
abstract class ApiResult2 with _$ApiResult2 {
  const factory ApiResult2.model(ModelB model) = _ModelB;
  const factory ApiResult2.failure(ApiFailure failure) = _ApiFailure2;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以做

  return apiResult1.when(
    model: (model) => SuccessWidget(),
    failure: (failure) => ErrorWidget(),
  );
Run Code Online (Sandbox Code Playgroud)