Я пытаюсь запрограммировать интерфейс с 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 с замороженными классами. Замороженный классы не могут быть ни расширены, ни реализованы.
Интересно узнать, считают ли люди это недостатком, если да.
@ rkdupr0n Да, я так думаю, спасибо, но все еще получаю ошибку





Я проверил ваш код и нашел проблему в сгенерированном файле. Дело в том, что заморозка не переопределяет сеттеры из реализованного абстрактного класса. Итак, для вашего IUserRegistrationEntity сделайте параметры геттерами. Вот так:
abstract class IUserRegistrationEntity {
String get nickName;
String get email;
String get confirmEmail;
String get password;
String get confirmPassword;
}
Спасибо, это работает. Я не думаю, что вы знаете, как заставить IUserRegistrationEntity знать о замороженных функциях, таких как copyWith? Так как без этого мой интерфейс бесполезен. Возможно, мне нужно будет задать еще один вопрос.
В этом случае я бы предложил создать еще один замороженный класс, взяв за основу IUserRegistrationEntity. Подождите, я отредактирую свой ответ.
К сожалению, вы не можете IUserRegistrationEntity узнать о замороженных функциях. Однако вы можете сделать то, что я прокомментировал ранее, и использовать этот класс. Однако новый класс будет точно таким же, как UserRegistrationEntity.
Спасибо. Я использовал ваше решение. Я только что использовал его, чтобы решить вторую проблему, о которой я вас спрашивал, поэтому я разместил его в другом ответе на случай, если кто-то еще заинтересован в том, чтобы сделать что-то подобное.
Я использовал решение 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
}
это будет выглядеть так
Разве не должно быть
constперед конструкторомfactoryдля сгенерированных фабрик?