flutter 如何在Freezed数据类中添加私有字段?

e1xvtsh3  于 2023-10-22  发布在  Flutter
关注(0)|答案(2)|浏览(139)

我想在Freezed数据类中添加私有字段。
所以,我试着写这个。

@freezed
class User with _$User {
  const factory User(
    String _id,
    String _name,
  ) = _User;
}

但是,在我的编辑器中,在user.freezed.dart中显示“Named parameters can't start with an underscore.(private_optional_parameter)”
请告诉我如何解决这个问题。

xvw2m8pv

xvw2m8pv1#

为了使Adnan的解决方案更明显:
您可以通过使用@protected注解来保护freezed类中的字段:

@freezed
class User with _$User {
  const factory User(
    @protected String id,
    @protected String name,
  ) = _User;
}

当然,这只是半有用的,除非您还定义了一些getter来访问受保护字段中的信息。

vsnjm48y

vsnjm48y2#

我希望有一个私有属性和一个返回修改变量的公共getter,使用@Default('')不能解决我的 * 转换 * 空类型为声音类型的问题。
总之-长话短说:冷冻(根据版本。2.4.5)默认情况下不允许在其类中使用私有属性,这是由于copyWith方法的代码生成问题。如果这个方法对你来说不重要,那么你可以告诉build_runner跳过它,这样注解你的类:

part 'user.freezed.dart';

@Freezed(copyWith: false)
class User with _$User {
  const factory User(String _id, String _name) = _User;
}

然后你的属性将无法被其他类访问(但是你不能在User对象上使用copyWith方法)。使用@protected注解标记代码并不是那么好,因为变量仍然是公开和可见的。
对于我的情况,我必须找到变通办法。我把代码片段留在这里,因为将来可能有人需要它(也可能是未来的我):

part 'user.freezed.dart';

@freezed
class User with _$User {
  //private constructor with exposed and generated public properties
  const factory User._(String id, String name) = _User;

  //public constructor modifying those values
  factory User(String? id, String? name) {
    return User._(id ?? 'you dont have id' name ?? '');
  }
}

相关问题