Pull to refresh

Comments 12

Интересно было бы сравнить с frozen. А в целом — впечатления не очень, много бойлерплейта и лямбды с билдерами.
Спасибо за статью.
В реальных проектах я обычно использую pub.dev/packages/json_annotation
который сделан как раз при помощи built_value
Если посмотреть обучалки по Flutter, то команда рекомендует использовать его, так как для json он удобнее.
Удобнее добавлять вложенные классы (которые автоматически на любой уровень вложенности десериализуются), Enums, поверх удобно оборачивать другими сериализаторами.
Вот тут подробно от команды Flutter
flutter.dev/docs/development/data-and-backend/json

Посоветуйте, пожалуйста, обучалки по Flutter на русском языке

Увы, не знаю. Прозвучит быть может не очень, но, все равно, рекомендую учить флаттер по англоязычным источникам + прокачивать английский.
Есть же книга на русском про флаттер довольно актуальная

json_annotation не имеет никакого отношения к built_value, это разные пакеты.

точно, не знал, предполагал что они его используют
Зачем в 2020 году built_value, когда есть freezed? Он может все тоже самое и даже больше. Сериализация из коробки без лишнего кода, фабричные конструкторы, которыми удобно представлять различные сущности, как енум, но лучше. Фризед по всем параметрам лучше.

Согласен, сейчас как раз мигрируем с built_value на freezed, и он действительно практически по всем параметрам удобнее. Единственное, чего не хватает – удобной работы с коллекциями.

Интересно, изменилось ли мнение за полгода? Чем таки лучше freezed vs built_value? Сейчас в команде ведем дискуссию, что использовать

Не изменилось – freezed гораздо удобнее. Мы проект полностью перевели на freezed для моделей и, частично, для сложных DTO. Плюсы:


  • стерилизацию он делегирует пакету json_serializable, которую мы уже используем для DTO;
  • меньше бойлерплейта. Не котлиновские дата-классы, конечно, но хотя бы так:
    @freezed
    class CountryGroup with _$CountryGroup {
    const factory CountryGroup({
      required CountryGroupCode code,
      required String englishName,
      required Iterable<Country> countries,
    }) = _CountryGroup;
    }
  • генерация coproduct типов.
замечательно

забыли об еще одном важном методе для десериализации _initializeBuilder, который позволяет задавать начальные значения, если таковые не нашлись в десериализуемом объекте. Пример:

  static void _initializeBuilder(LocalSettingsBuilder b) => b
    ..enableRestLogging = false
    ..enableWebSocketLogging = false;

Sign up to leave a comment.

Articles