#dart #tostring
Вопрос:
У меня есть много моделей JSON в моем проекте dart, которые я хотел бы иметь строковое представление. Я знаю, что могу переопределить .toString()
метод для каждого класса, но мне кажется, что много работы, чтобы писать в основном одно и то же несколько раз. Есть ли способ, которым я могу создать микс или расширение для переопределения toString? Или лучше использовать генерацию кода? (Я нашел этот пакет, но, похоже, он больше не поддерживается)
Строковое представление, которое я ищу, — это просто список всех параметров, например:
@JsonSerializable()
class User {
UserOver(
this.userId,
this.name,
);
int userId;
/// The full name of the user.
String name;
factory UserOverview.fromJson(Map<String, dynamic> json) => _$UserOverviewFromJson(json);
Map<String, dynamic> toJson() => _$UserOverviewToJson(this);
}
должно иметь следующее строковое представление:
User(userId: 1, name: "Name")
Ответ №1:
Ты сам ответил на свой вопрос, приятель. Просто создайте базовый класс и передайте его на аутсорсинг. Это просто.
Например:
@JsonSerializable()
class User extends BaseModel {
User({
required this.userId,
required this.name,
});
int userId;
/// The full name of the user.
String name;
factory User.fromJson(Map<String, dynamic> json) =>
_$UserOverviewFromJson(json);
@override
Map<String, dynamic> toJson() => _$UserOverviewToJson(this);
}
Создайте класс базовой модели
abstract class BaseModel {
Map<String, dynamic> toJson();
@override
String toString() {
return toJson().toString();
}
}
Не забывай об этом
User _$UserOverviewFromJson(Map<String, dynamic> json) => User(name: json['name'] as String, userId: json['userId'] as int);
Map<String, dynamic> _$UserOverviewToJson(User instance) => <String, dynamic>{
'name': instance.name,
'userId': instance.userId,
};
Теперь, чтобы использовать:
final cool = User(userId: 1, name: "Name");
print(cool.toString()); //{name: Name, userId: 1}
Комментарии:
1. О, ух ты. Я и не подозревал, что был так близок к ответу. Спасибо!