Flutter+Firebase创建用户时,如何用DateTime.now()做模型默认值?
Dart为User模型DateTime字段设置默认值的解决方法
Dart要求可选参数的默认值必须是编译时常量,而DateTime.now()是运行时计算的值,直接作为默认值会触发报错。以下是两种可行的解决方案:
方案一:可空参数+初始化列表
将构造函数中的createdDate和modifiedDate设为可空类型,通过初始化列表为final字段赋值,参数未传入时自动使用当前时间:
@JsonSerializable() class User { final String id; final String email; final bool isAdmin; final bool canDeleteUser; final bool canCreateUser; final String nom; final String prenom; final DateTime createdDate; final DateTime modifiedDate; User({ this.id = '', this.email = '', this.isAdmin = false, this.nom = '', this.prenom = '', this.canCreateUser = false, this.canDeleteUser = false, DateTime? createdDate, DateTime? modifiedDate, }) : createdDate = createdDate ?? DateTime.now(), modifiedDate = modifiedDate ?? DateTime.now(); factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json); Map<String, dynamic> toJson() => _$UserToJson(this); }
核心逻辑:利用??空合并运算符,当外部未传入对应参数时,自动用DateTime.now()为final字段赋值,既满足final字段的不可变性要求,又实现了默认当前时间的效果。
方案二:私有构造函数+公开构造函数(适配复杂场景)
通过私有构造函数封装所有必填参数,对外提供友好的构造函数处理默认值,同时保留fromJson的反序列化逻辑:
@JsonSerializable() class User { final String id; final String email; final bool isAdmin; final bool canDeleteUser; final bool canCreateUser; final String nom; final String prenom; final DateTime createdDate; final DateTime modifiedDate; // 私有构造函数,仅内部调用 User._({ required this.id, required this.email, required this.isAdmin, required this.canDeleteUser, required this.canCreateUser, required this.nom, required this.prenom, required this.createdDate, required this.modifiedDate, }); // 对外公开的构造函数,处理默认值 User({ String id = '', String email = '', bool isAdmin = false, bool canDeleteUser = false, bool canCreateUser = false, String nom = '', String prenom = '', DateTime? createdDate, DateTime? modifiedDate, }) : this._( id: id, email: email, isAdmin: isAdmin, canDeleteUser: canDeleteUser, canCreateUser: canCreateUser, nom: nom, prenom: prenom, createdDate: createdDate ?? DateTime.now(), modifiedDate: modifiedDate ?? DateTime.now(), ); factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json); Map<String, dynamic> toJson() => _$UserToJson(this); }
注意事项
原代码中的_$UsersFromJson和_$UsersToJson存在笔误,应改为_$UserFromJson和_$UserToJson(与类名User对应),否则json_serializable生成的代码会匹配失败。
内容的提问来源于stack exchange,提问作者Gautier Chuinard
相关产品推荐
相关产品推荐

