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

Flutter中Realm报错‘unable to decrypt after 0 seconds’求助

Flutter Realm插入数据触发DecryptionFailed错误的解决方案

以下是针对你遇到的realm::util::DecryptionFailed错误的排查和解决步骤:

1. 检查加密密钥的合法性与一致性

Realm加密要求密钥必须是64字节(512位)的随机二进制数据,且必须和创建数据库时使用的密钥完全一致:

  • 确认rawKey的长度是否为64字节,长度不符会直接导致解密失败;
  • 若数据库从其他设备/环境迁移而来,确保密钥完全同步,包括字节顺序、编码方式(避免字符串转字节时出现编码错误)。

2. 修复Configuration配置的语法错误

你的配置代码中shouldDeleteIfMigrationNeeded: ,缺失布尔值参数(需传入true或false),这会导致配置初始化异常,间接影响加密逻辑。修正后的配置示例:

var config = Configuration.local(
  schemas,
  encryptionKey: rawKey,
  path: "$_dbPath/${dbType.name}.realm",
  schemaVersion: odaSchemaVersion,
  shouldDeleteIfMigrationNeeded: true, // 根据业务需求选择true或false
  shouldCompactCallback: (_forServer ? (totalSize, usedSize) => true : null),
);

3. 验证数据库文件状态

如果数据库文件是未加密状态下创建的,或者文件已损坏,添加加密密钥后会触发解密错误:

  • 删除目标路径下的现有.realm文件(路径为"$_dbPath/${dbType.name}.realm"),让Realm使用当前加密密钥重新创建数据库;
  • 若数据库是从外部导入的,确认导入的文件是用相同密钥加密的合法Realm文件。

4. 确保Realm实例的线程使用正确

Realm实例不能跨线程使用,确认你的realm实例是在当前UI线程(错误日志中的io.flutter.1.ui线程)初始化的,若需在其他线程操作,使用Realm.withConfig在目标线程重新初始化实例。

5. 重新生成加密密钥(终极排查步骤)

如果以上步骤都无效,尝试重新生成合规的加密密钥并重建数据库:

// 生成64字节的随机加密密钥
final rawKey = List<int>.generate(64, (i) => Random.secure().nextInt(256));

删除旧数据库文件后,用新密钥初始化Realm,再执行插入操作验证是否解决问题。

内容的提问来源于stack exchange,提问作者Thanapon Makmesup

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 01:05:08