Flutter Firestore报错:参数类型‘DateTime?’无法分配给‘DateTime’
解决Firestore模型类DateTime类型不匹配报错
你的报错原因很明确:Users类中birthday字段定义为非空的DateTime类型,但fromJson工厂方法里当Firestore返回的json["birthday"]为空时,你返回了null(属于DateTime?可空类型),两者类型不兼容。
根据业务需求,有两种解决方式:
方式一:允许birthday字段为空
如果用户的生日信息可能不存在,把birthday改为可空类型,同时调整构造函数和序列化逻辑:
import 'dart:convert'; Users UsersFromJson(String str) => Users.fromJson(json.decode(str)); String UsersToJson(Users data) => json.encode(data.toJson()); class Users { Users({ required this.id, required this.url, required this.name, this.birthday, // 移除required,允许传入null }); String id; String name; String url; DateTime? birthday; // 改为可空DateTime类型 factory Users.fromJson(Map<String, dynamic> json) => Users( id: json["id"] ?? "", name: json["name"] ?? "", url: json["url"] ?? "", birthday: json["birthday"] != null ? DateTime.parse(json["birthday"]) : null, ); Map<String, dynamic> toJson() => { "id": id, "name": name, "url": url, "birthday": birthday?.toString(), // 可空类型用?.安全调用toString }; }
方式二:确保birthday字段必有值
如果业务上要求用户必须有生日信息,在fromJson中给空值场景设置默认日期(比如当前时间或一个固定默认值):
import 'dart:convert'; Users UsersFromJson(String str) => Users.fromJson(json.decode(str)); String UsersToJson(Users data) => json.encode(data.toJson()); class Users { Users({ required this.id, required this.url, required this.name, required this.birthday, }); String id; String name; String url; DateTime birthday; // 保持非空类型 factory Users.fromJson(Map<String, dynamic> json) => Users( id: json["id"] ?? "", name: json["name"] ?? "", url: json["url"] ?? "", // 空值时返回默认日期,这里用当前时间示例,你可以替换成业务需要的默认值 birthday: json["birthday"] != null ? DateTime.parse(json["birthday"]) : DateTime.now(), ); Map<String, dynamic> toJson() => { "id": id, "name": name, "url": url, "birthday": birthday.toString(), // 非空类型直接调用toString }; }
内容的提问来源于stack exchange,提问作者Dasun Dola
相关产品推荐
相关产品推荐

