You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中Hive Box数据备份JSON遇TransactionModel编码失败问题

问题解决:Hive数据备份JSON编码失败

错误原因

  1. jsonEncode无法直接序列化Iterable<TransactionModel>对象集合,必须手动将每个TransactionModel转换为Map<String, dynamic>。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 01:21:04