Union of Modddels Overview
You know by now how to create a modddel. But what if you want to make a union of modddels ?
In freezed, you would do something like this :
@freezed
class Weather with _$Weather {
const factory Weather.sunny({
required int temperature,
}) = _Sunny;
const factory Weather.rainy({
required int temperature,
required double rainIntensity,
}) = _Rainy;
}Basically, you create one factory constructor per union-case. The same principle applies for making a union of modddels. In our example, we will consider Weather as a union of two MultiValueObjects : Sunny and Rainy.
@Modddel(
validationSteps: [
ValidationStep([
Validation('habitable', FailureType<WeatherHabitableFailure>()),
]),
],
)
class Weather extends MultiValueObject<InvalidWeather, ValidWeather>
with _$Weather {
Weather._();
factory Weather.sunny({
required int temperature,
}) {
return _$Weather._createSunny(
temperature: temperature,
);
}
factory Weather.rainy({
required int temperature,
required double rainIntensity,
}) {
return _$Weather._createRainy(
temperature: temperature,
rainIntensity: rainIntensity,
);
}
@override
Option<WeatherHabitableFailure> validateHabitable(weather) {
// TODO: implement validateHabitable
return none();
}
}
@freezed
class WeatherHabitableFailure extends ValueFailure with _$WeatherHabitableFailure {
const factory WeatherHabitableFailure.tooHot() = _TooHot;
const factory WeatherHabitableFailure.tooCold() = _TooCold;
const factory WeatherHabitableFailure.flooding() = _Flooding;
}As you can see, we have two factory constructors : Weather.sunny and Weather.rainy . This creates two MultiValueObjects Sunny and Rainy. Each one of these is a modddel with all of the functionality we've seen before :

On top of that, these classes are generated :

These classes are what we call "super-sealed classes". They are classes that have multiple modddels as union-cases (called "case-modddels"). This table shows the relationship between the super-sealed classes and the two modddels.
Weather
Sunny - Rainy
ValidWeather
ValidSunny - ValidRainy
InvalidWeather
InvalidSunny - InvalidRainy
InvalidWeatherValue
InvalidSunnyValue - InvalidRainyValue
Last updated