【问题标题】:Flutter - Error implementing interface with FreezedFlutter - 使用 Freezed 实现接口时出错
【发布时间】:2025-11-30 02:45:01
【问题描述】:

我正在尝试使用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 与冻结的类一起使用。冷冻 类既不能扩展也不能实现。

想知道人们是否认为这是一个缺点。

【问题讨论】:

  • 生成工厂的factory构造函数之前不应该有const吗?
  • @rkdupr0n 是的,我想是的,谢谢,但仍然收到错误

标签: flutter freezed


【解决方案1】:

我测试了您的代码并从生成的文件中发现了问题。问题是, freezed 不会覆盖已实现抽象类的设置器。因此,对于您的IUserRegistrationEntity,将参数设置为 getter。像这样:

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

【讨论】:

  • 感谢这项工作。我想你不知道如何让IUserRegistrationEntity 知道诸如copyWith 之类的冻结函数?因为没有它我的界面就没有用。我可能需要再问一个问题。
  • 在这种情况下,我建议创建另一个以IUserRegistrationEntity 为基础的冻结类。等等,我会编辑我的答案。
  • 不幸的是,你不能让IUserRegistrationEntity 知道冻结的函数。但是,您可以执行我之前评论的操作并使用该类。但是,新类将与 UserRegistrationEntity 完全相同。
  • 谢谢。我用了你的解决方案。我刚刚在它的基础上解决了我问你的第二个问题,所以我将它发布在另一个答案中,以防其他人有兴趣做类似的事情。
【解决方案2】:

我使用了 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();
}

【讨论】:

    【解决方案3】:

    添加私有空构造器代码

    生成冻结用户类的示例

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

    应该是这样的

    【讨论】: