freezed 3
У нас тут был большой релиз, и будто бы все отодвинулось на второй-третий план.
Тем временем, вышел мажорный апдейт freezed. Для обновления лучше руководствоваться инструкцией по миграции, так как изменились некоторые ключевые механики плагина.
Ниже список того, что мне больше всего приглянулось. Полный список нововведений тут.
1️⃣ Наследование
Выделил это первым пунктом и отдельно. Боль нашего проекта, из-за которой очень долгое время приходилось (и приходится) использовать built_value, в котором наследование было с давних времен (само решение такое себе, очень много лишнего в процессе работы появляется).
Выглядит наследование во freezed
следующим образом:
class Base {
Base(String value);
}
@freezed
class Usual extends Base with _$Usual {
Usual({int? a}) a = a ?? 0, super('value');
final int a;
}
Остается только вопрос, что делать с тысячами строк уже написанного кода на built_value
и обертками для него ;)
2️⃣ Mixed Mode
freezed
теперь поддерживает 2 способа создания классов.
Первый из них - обычный, уже знакомый нам по предыдущим версиям:
@freezed
sealed class Usual with _$Usual {
factory Usual({int a}) = _Usual;
}
Второй же более простой, удобный для создания небольших сущностей без специфического синтаксиса:
@freezed
class Usual with _$Usual {
Usual({this.a});
final int a;
}
Такая форма так же позволяет использовать все возможности конструкторов, включая вызов super у родительского класса.
3️⃣ Возможность добавлять не константные значения по умолчанию
Тоже та еще головная боль, в особенности при работе с большими / сложными сущностями.
Конструктор теперь принимает любые значения, можно посмотреть на примере ниже:
@freezed
sealed class Response<T> with _$Response<T> {
// Параметр "time" не константный, раньше такое не сработало бы
Response._({DateTime? time}) : time = time ?? DateTime.now();
factory Response.data(T value, {DateTime? time}) = ResponseData;
factory Response.error(Object error) = ResponseError;
@override
final DateTime time;
}
4️⃣ map/when
больше не генерируются
Если раньше у нас имелись методы по типу map или when, которые позволяли писать код с учетом всех вариаций состояний для блоков, например, то теперь freezed использует Дартовый паттерн-метчинг.
Было:
final model = Model.first('42');
final res = model.map(
first: (String a) => 'first $a',
second: (int b, bool c) => 'second $b $c',
);
Стало:
final model = Model.first('42');
final res = switch (model) {
First(:final a) => 'first $a',
Second(:final b, :final c) => 'second $b $c',
};
Важно! Это - “ломающее” изменение в новой версии freezed
. После обновления варианта с map
не будет, нужна миграция!