8

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

Either<ApiFailure,ModelA> apiResult1;
Either<ApiFailure,ModelB> apiResult2;

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

return apiResul1.fold<Widget>(
  (left) => ErrorWidget(),
  (right) => SuccessWidget(),
);

我使用 freezed 包创建了ApiFailureModelA和作为数据类。ModelB我知道 freezed 带有类似的 Union 类支持,例如 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;
}

ApiFailure请注意,在上述两个联合类中,我正在重新定义ApiResult2我要避免的。

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

4

1 回答 1

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;
}

然后你可以做

  return apiResult1.when(
    model: (model) => SuccessWidget(),
    failure: (failure) => ErrorWidget(),
  );
于 2021-02-04T21:09:02.557 回答