Flutter - ошибка реализации интерфейса с Freezed

Я пытаюсь запрограммировать интерфейс с Freezed. Я хочу иметь возможность указывать во всем приложении тип IUserRegistrationEntity;

Мой интерфейс:

abstract class IUserRegistrationEntity {
  String nickName;
  String email;
  String confirmEmail;
  String password;
  String confirmPassword;
}

Мой замороженный класс:

import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:vepo/domain/user_registration/i_user_registration_entity.dart';

part 'user_registration_entity.freezed.dart';

@freezed
abstract class UserRegistrationEntity with _$UserRegistrationEntity {
  @Implements(IUserRegistrationEntity)
  factory UserRegistrationEntity(
      {String nickName,
      String email,
      String confirmEmail,
      String password,
      String confirmPassword}) = _UserRegistrationEntity;
}

Получение ошибки при запуске приложения:

lib/domain/user_registration/user_registration_entity.freezed.dart:165:7: Error: The non-abstract class '_$_UserRegistrationEntity' is missing implementations for these members:
 - IUserRegistrationEntity.confirmEmail
 - IUserRegistrationEntity.confirmPassword
 - IUserRegistrationEntity.email
 - IUserRegistrationEntity.nickName
 - IUserRegistrationEntity.password
Try to either
 - provide an implementation,
 - inherit an implementation from a superclass or mixin,
 - mark the class as abstract, or
 - provide a 'noSuchMethod' implementation.

class _$_UserRegistrationEntity implements _UserRegistrationEntity {
      ^^^^^^^^^^^^^^^^^^^^^^^^^
lib/domain/user_registration/i_user_registration_entity.dart:4:10: Context: 'IUserRegistrationEntity.confirmEmail' is defined here.
  String confirmEmail;

         ^^^^^^^^^^^^
lib/domain/user_registration/i_user_registration_entity.dart:6:10: Context: 'IUserRegistrationEntity.confirmPassword' is defined here.
  String confirmPassword;
         ^^^^^^^^^^^^^^^
lib/domain/user_registration/i_user_registration_entity.dart:3:10: Context: 'IUserRegistrationEntity.email' is defined here.
  String email;
         ^^^^^
lib/domain/user_registration/i_user_registration_entity.dart:2:10: Context: 'IUserRegistrationEntity.nickName' is defined here.
  String nickName;
         ^^^^^^^^

lib/domain/user_registration/i_user_registration_entity.dart:5:10: Context: 'IUserRegistrationEntity.password' is defined here.
  String password;

         ^^^^^^^^

Что я делаю не так?

Обновлено: означает ли эта цитата из документации пакета, что это невозможно?

Примечание 2. Нельзя использовать @With/@Implements с замороженными классами. Замороженный классы не могут быть ни расширены, ни реализованы.

Интересно узнать, считают ли люди это недостатком, если да.

Разве не должно быть const перед конструктором factory для сгенерированных фабрик?

rkdupr0n 12.12.2020 05:27

@ rkdupr0n Да, я так думаю, спасибо, но все еще получаю ошибку

BeniaminoBaggins 12.12.2020 05:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
5 824
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я проверил ваш код и нашел проблему в сгенерированном файле. Дело в том, что заморозка не переопределяет сеттеры из реализованного абстрактного класса. Итак, для вашего IUserRegistrationEntity сделайте параметры геттерами. Вот так:

abstract class IUserRegistrationEntity {
  String get nickName;
  String get email;
  String get confirmEmail;
  String get password;
  String get confirmPassword;
}

Спасибо, это работает. Я не думаю, что вы знаете, как заставить IUserRegistrationEntity знать о замороженных функциях, таких как copyWith? Так как без этого мой интерфейс бесполезен. Возможно, мне нужно будет задать еще один вопрос.

BeniaminoBaggins 12.12.2020 10:03

В этом случае я бы предложил создать еще один замороженный класс, взяв за основу IUserRegistrationEntity. Подождите, я отредактирую свой ответ.

rkdupr0n 12.12.2020 10:20

К сожалению, вы не можете IUserRegistrationEntity узнать о замороженных функциях. Однако вы можете сделать то, что я прокомментировал ранее, и использовать этот класс. Однако новый класс будет точно таким же, как UserRegistrationEntity.

rkdupr0n 12.12.2020 10:31

Спасибо. Я использовал ваше решение. Я только что использовал его, чтобы решить вторую проблему, о которой я вас спрашивал, поэтому я разместил его в другом ответе на случай, если кто-то еще заинтересован в том, чтобы сделать что-то подобное.

BeniaminoBaggins 12.12.2020 12:08

Я использовал решение rkdupr0n. Я просто хотел бы сказать, что я также сообщил интерфейсу IUserRegistrationEntity о функциях пакета Freezed, чтобы я мог вызывать их при программировании для интерфейса IUserRegistrationEntity. Ну, только те, которые мне нужны в данный момент. Скоро добавлю остальные.

Замороженный класс становится:

import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:vepo/domain/user_registration/i_user_registration_entity.dart';

part 'user_registration_entity.freezed.dart';
part 'user_registration_entity.g.dart';

@freezed
abstract class UserRegistrationEntity with _$UserRegistrationEntity {
  @Implements.fromString(
      'IUserRegistrationEntity<\$UserRegistrationEntityCopyWith<IUserRegistrationEntity>>')
  const factory UserRegistrationEntity(
      {String nickName,
      String email,
      String confirmEmail,
      String password,
      String confirmPassword}) = _IUserRegistrationEntity;

  factory UserRegistrationEntity.fromJson(Map<String, dynamic> json) =>
      _$UserRegistrationEntityFromJson(json);
}

Интерфейс:

abstract class IUserRegistrationEntity<T> extends FreezedClass<T> {
  String get nickName;
  String get email;
  String get confirmEmail;
  String get password;
  String get confirmPassword;
}

abstract class FreezedClass<T> {
  T get copyWith;
  Map<String, dynamic> toJson();
}

добавить закрытый пустой код конструктора

пример, если вы создаете замороженный пользовательский класс

@freezed
abstract class User with _$User {
  const User._(); // add this
}

это будет выглядеть так

Другие вопросы по теме