В 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 and
ApiFailure`.
@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(),
);