#flutter #dart #freezed
Вопрос:
Все мои объекты в приложении, которые используют @freezed, создают по 2 поля для каждого поля.
Я на freezed: ^0.12.7
Когда я копирую, вставьте пример из документов версии 0.12.7:
import 'package:freezed_annotation/freezed_annotation.dart';
part 'x.freezed.dart';
@freezed
abstract class Person implements _$Person {
// uses implements instead of with
const Person._(); // Added constructor
const factory Person(String name, {int age}) = _Person;
void method() {
print('hello world');
}
}
Происходит удвоение:
РЕДАКТИРОВАТЬ: Я только что подтвердил точно такое же поведение в freezed 0.14.1 2
.
С копированием и вставкой из официальных документов:
@freezed
class Person with _$Person {
const Person._(); // Added constructor
const factory Person(String name, {int? age}) = _Person;
void method() {
print('hello world');
}
}
Комментарии:
1. я все еще получаю это в замороженном состоянии: ^1.1.0 вы все еще получаете это в последних версиях?
Ответ №1:
Я получаю хорошую генерацию Person
объекта из вашего кода. В вашем заявлении может быть какая-то ошибка, связанная с вашим part
заявлением. Всякий раз, когда вы создаете новый класс , используйте @freeze
с part 'name.freezed.dart'
, поэтому в этом случае это должно быть:
import 'package:freezed_annotation/freezed_annotation.dart';
part 'person.freezed.dart';
@freezed
abstract class Person implements _$Person {
// uses implements instead of with
const Person._(); // Added constructor
const factory Person(String name, {int age}) = _Person;
void method() {
print('hello world');
}
}
Вот моя генерация кода после выполнения flutter pub run build_runner build
команды:
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies
part of 'person.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
T _$identity<T>(T value) => value;
/// @nodoc
class _$PersonTearOff {
const _$PersonTearOff();
// ignore: unused_element
_Person call(String name, {int age}) {
return _Person(
name,
age: age,
);
}
}
/// @nodoc
// ignore: unused_element
const $Person = _$PersonTearOff();
/// @nodoc
mixin _$Person {
String get name;
int get age;
@JsonKey(ignore: true)
$PersonCopyWith<Person> get copyWith;
}
/// @nodoc
abstract class $PersonCopyWith<$Res> {
factory $PersonCopyWith(Person value, $Res Function(Person) then) =
_$PersonCopyWithImpl<$Res>;
$Res call({String name, int age});
}
/// @nodoc
class _$PersonCopyWithImpl<$Res> implements $PersonCopyWith<$Res> {
_$PersonCopyWithImpl(this._value, this._then);
final Person _value;
// ignore: unused_field
final $Res Function(Person) _then;
@override
$Res call({
Object name = freezed,
Object age = freezed,
}) {
return _then(_value.copyWith(
name: name == freezed ? _value.name : name as String,
age: age == freezed ? _value.age : age as int,
));
}
}
/// @nodoc
abstract class _$PersonCopyWith<$Res> implements $PersonCopyWith<$Res> {
factory _$PersonCopyWith(_Person value, $Res Function(_Person) then) =
__$PersonCopyWithImpl<$Res>;
@override
$Res call({String name, int age});
}
/// @nodoc
class __$PersonCopyWithImpl<$Res> extends _$PersonCopyWithImpl<$Res>
implements _$PersonCopyWith<$Res> {
__$PersonCopyWithImpl(_Person _value, $Res Function(_Person) _then)
: super(_value, (v) => _then(v as _Person));
@override
_Person get _value => super._value as _Person;
@override
$Res call({
Object name = freezed,
Object age = freezed,
}) {
return _then(_Person(
name == freezed ? _value.name : name as String,
age: age == freezed ? _value.age : age as int,
));
}
}
/// @nodoc
class _$_Person extends _Person {
const _$_Person(this.name, {this.age})
: assert(name != null),
super._();
@override
final String name;
@override
final int age;
@override
String toString() {
return 'Person(name: $name, age: $age)';
}
@override
bool operator ==(dynamic other) {
return identical(this, other) ||
(other is _Person amp;amp;
(identical(other.name, name) ||
const DeepCollectionEquality().equals(other.name, name)) amp;amp;
(identical(other.age, age) ||
const DeepCollectionEquality().equals(other.age, age)));
}
@override
int get hashCode =>
runtimeType.hashCode ^
const DeepCollectionEquality().hash(name) ^
const DeepCollectionEquality().hash(age);
@JsonKey(ignore: true)
@override
_$PersonCopyWith<_Person> get copyWith =>
__$PersonCopyWithImpl<_Person>(this, _$identity);
}
abstract class _Person extends Person {
const _Person._() : super._();
const factory _Person(String name, {int age}) = _$_Person;
@override
String get name;
@override
int get age;
@override
@JsonKey(ignore: true)
_$PersonCopyWith<_Person> get copyWith;
}
Комментарии:
1. Это точно такой же сгенерированный код, как и у меня. Я думаю, что если бы вы проверили в отладчике, у вас была бы та же проблема.