В Freezed можно ли создавать случаи объединения из уже существующих замороженных классов данных

Я использую замороженный пакет для создания парсеров json и классов данных. На данный момент я использую пакет dartz для создания кейсов Union и обработки их в виджетах Flutter. Например, некоторые из моих классов Union выглядят следующим образом.

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

и я использую их в своем конструкторе виджетов флаттера, складывая их и возвращая определенный виджет для каждого случая. Например.

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

я создал ApiFailure, ModelA, а также 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объект. Надеюсь, мой вопрос ясен.

1 ответ

Почему бы не использовать ваши классы данных в качестве параметров?

      @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(),
  );
Другие вопросы по тегам