Firebase Realtime Database写入报错[firebase_database/unknown] Could not convert
解决Firebase Realtime Database写入时的
[firebase_database/unknown] Could not convert错误 这个错误的核心原因是传入的数据包含Firebase Realtime Database无法直接序列化的Dart自定义类型,从堆栈信息看,jsify函数无法转换你的数据,具体涉及两个关键问题:
1. 自定义对象列表无法被序列化
你的BeatItSession中的usersadded是List<User>类型,Firebase不支持直接存储自定义的User对象,必须先将每个User转换为Firebase支持的Map<String, dynamic>结构。
修复方式:
确保User类有toMap()方法,将对象属性转换为基础类型:
class User { final String uid; // 其他属性如name、email等 User({required this.uid}); Map<String, dynamic> toMap() { return { 'uid': uid, // 其他属性按实际需求添加,确保都是字符串、数字等基础类型 }; } }
然后在BeatItSession的toMap()方法中,将usersadded转换为Map列表:
Map<String, dynamic> toMap() { return { // ...其他字段 'usersadded': usersadded.map((user) => user.toMap()).toList(), // ...其他字段 }; }
2. DateTime类型无法直接存储
Firebase Realtime Database不支持Dart的DateTime类型,需要将其转换为毫秒时间戳(int)或ISO 8601字符串(String)。
修复方式:
在BeatItSession的toMap()方法中转换时间字段:
Map<String, dynamic> toMap() { return { // ...其他字段 'creationTime': creationTime.millisecondsSinceEpoch, // 转成毫秒时间戳 'lastModified': lastModified.millisecondsSinceEpoch, // 或者转成ISO字符串:creationTime.toIso8601String() // ...其他字段 }; }
3. 逐步验证排查
如果还是报错,可以先注释掉usersadded和DateTime字段,只写入简单类型(字符串、数字)测试:
await sessionRef.set({ 'sessionid': id, 'beatString': beat.beatString, 'hostID': host.uid, });
确认能成功写入后,再逐个添加字段排查,定位是否还有其他无法序列化的类型。
额外注意
- 确保你的Firebase规则已经开放写入权限(你提到已开放读取,也要确认写入权限):
{ "rules": { ".read": true, ".write": true } }
(生产环境请务必修改为安全规则,此处仅用于测试)
内容的提问来源于stack exchange,提问作者Zeroject
相关产品推荐
相关产品推荐

