Флаттер заморожен — Объект имеет по два из каждого поля

#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. Это точно такой же сгенерированный код, как и у меня. Я думаю, что если бы вы проверили в отладчике, у вас была бы та же проблема.