#android-studio #flutter #dart #auto-generate #json-serializable
#android-studio #flutter #dart #автоматическая генерация #json-сериализуемый
Вопрос:
плагин json_serializable от Dart отлично справляется с автоматической генерацией некоторых подверженных ошибкам и громоздких частей кода в обмен на некоторый шаблон: два метода, одна аннотация и одна ссылка на сгенерированный файл.
import 'package:json_annotation/json_annotation.dart';
part 'location.g.dart';
@JsonSerializable()
class Location {
final double lat;
final double lng;
Location(this.lat, this.lng);
factory Location.fromJson(Map<String, dynamic> json) =>
_$LocationFromJson(json);
Map<String, dynamic> toJson() => _$LocationToJson(this);
}
Очевидно, что это лучше сделать также машиной, например, конструктором для этого класса: я просто пишу последнее поле, затем нажимаю alt enter, и Android Studio помещает конструктор для меня.
Кто-нибудь знает, как заставить Android Studio сделать это для json_serializable?
Ответ №1:
Существует расширение кода Visual Studio, называемое генератором класса данных Dart (https://marketplace.visualstudio.com/items?itemName=BendixMa.dart-data-class-generator ), которому можно предоставить либо список конечных полей, либо даже образец файла JSON, и он сгенерирует класс данных в комплекте со многими полезными методами. В нем утверждается:
Генератор может генерировать методы constructor, copyWith, toMap, fromMap, toJSON, FromJSON, toString, operator == и hashCode для класса на основе свойств класса или необработанного JSON.
Если вы на стороне Java, я также вижу: https://plugins.jetbrains.com/plugin/12429-dart-data-class но я с этим не играл.
Комментарии:
1. Что ж, это прекрасное решение, и для Android Studio также есть аналогичные плагины. Но я уже использую плагин json_serializable. Я написал простое решение, которое на данный момент удовлетворяет мои потребности, вы можете увидеть его в моем ответе.
Ответ №2:
Я, наконец, написал этот простой сценарий с живым шаблоном. Вам просто нужно ввести имя файла и список полей. Смотрите gif ниже.
import 'package:json_annotation/json_annotation.dart';
part '$NAME$.g.dart'
@JsonSerializable(explicitToJson: true)
class $CAP_NAME$ {
$END$
$CAP_NAME$();
factory $CAP_NAME$.fromJson(Map<String, dynamic> json) => _$$CAP_NAME$FromJson(json);
Map<String, dynamic> toJson() => _$$CAP_NAME$ToJson(this);
}
Что ж, в этом простом решении теперь генерируется упомянутая boiler plate, и это отлично работает для меня, но это действительно очень наивный способ, я не потратил много времени на изучение сценария живого шаблона. Одним из улучшений является то, что он записывает поля в список параметров конструктора вместо того, чтобы делать это вручную. Другой способ — использовать скрипт шаблона файла, который я не изучал, и, возможно, создать файл и поля в диалоговом окне.