Flutter中Hive Box数据备份JSON遇TransactionModel编码失败问题
问题解决:Hive数据备份JSON编码失败
错误原因
jsonEncode无法直接序列化Iterable<TransactionModel>对象集合,必须手动将每个TransactionModel转换为Map<String, dynamic>。DateTime类型默认不被JSON编码器支持,直接放入toJson会导致序列化失败。
修复步骤
1. 修正TransactionModel的toJson方法,处理DateTime
将date转换为ISO标准字符串,使其可被JSON序列化:
Map<String, dynamic> toJson() { return { 'id': id, 'category': category.toJson(), 'paymentmode': paymentmode, 'isexpense': isexpense, 'date': date.toIso8601String(), // 转换为JSON支持的字符串格式 'note': note, 'amount': amount, }; }
2. 修正TransactionModel.fromjson方法,解析DateTime字符串
恢复数据时将ISO字符串还原为DateTime对象:
factory TransactionModel.fromjson(Map<String, dynamic> map) { return TransactionModel( id: map['id'], category: CategoryModel.fromjson(map['category']), paymentmode: map['paymentmode'], isexpense: map['isexpense'], date: DateTime.parse(map['date']), // 解析ISO字符串为DateTime note: map['note'], amount: map['amount'], ); }
3. 修改备份函数,批量转换模型为可序列化对象
遍历Hive Box中的每个TransactionModel,调用toJson()转为Map后再统一编码:
Future<void> _createBackupFile() async { File backupFile = File('${Directory.systemTemp.path}/logic.json'); try { // 逐个转换模型为JSON可识别的Map结构 final transactions = Hive.box<TransactionModel>('ebook') .values .map((tx) => tx.toJson()) .toList(); await backupFile.writeAsString(jsonEncode(transactions)); } catch (e) { print('Error is :' + e.toString()); } }
验证说明
修改后,备份函数会先将所有TransactionModel转换为JSON支持的Map结构(DateTime转为字符串),再整体编码为JSON字符串,即可解决序列化失败的问题。恢复数据时,使用fromjson方法可以正确将字符串解析回DateTime和模型对象。
内容的提问来源于stack exchange,提问作者Irfan Ganatra
相关产品推荐
相关产品推荐

