Flutter Isar中IsarLinks.add()添加关联对象报错的解决咨询
修复Isar 3.0.0-dev.7中IsarLinks关联报错的问题
问题核心原因
- Isar 3.x的
IsarLinks要求关联操作必须在Isar事务内执行,且关联对象必须是Isar已追踪的实例(即已成功存入Isar的对象)。 - 原代码在事务外创建Chat并添加User,此时Chat尚未被Isar管理,直接操作
users.add()会导致关联状态异常。 - 异步逻辑中混用
putSync和await,容易引发对象状态不一致。
具体修复方案
方案一:统一在事务内完成所有操作
将Chat的创建、保存、关联操作全部放在write事务中,确保Chat被Isar追踪后再处理关联:
Future<void> makeChatWithUserAsync(User store) async { final isar = await db; await isar.writeTxn(() async { // 1. 创建Chat并设置基础属性 final _chat = Chat()..chatname = _user.name; // 2. 将Chat存入Isar,使其被Isar管理 await isar.chats.put(_chat); // 3. 添加已保存的User关联并保存 _chat.users.add(store); await _chat.users.save(); }); print("chat saved"); }
方案二:确保关联的User是Isar追踪实例
如果你的store是本地新建的User对象(即使之前调用过put),建议从Isar中重新获取该User,避免使用未被追踪的本地实例:
Future<void> makeChatWithUserAsync(int targetUserId) async { final isar = await db; await isar.writeTxn(() async { // 从Isar获取已保存的User实例 final store = await isar.users.get(targetUserId); if (store == null) { print("目标用户不存在"); return; } final _chat = Chat()..chatname = _user.name; await isar.chats.put(_chat); _chat.users.add(store); await _chat.users.save(); }); print("chat saved"); }
方案三:检查Isar模型定义规范
确保Chat和User的集合定义符合Isar 3.x要求,特别是IsarLinks的声明:
// Chat集合 @collection class Chat { Id id = Isar.autoIncrement; String? chatname; // 正确声明IsarLinks<User> final users = IsarLinks<User>(); } // User集合 @collection class User { Id id = Isar.autoIncrement; String? name; // 可选:添加反向关联(支持双向查询) final chats = IsarLinks<Chat>(); }
额外建议
你使用的是Isar 3.0.0-dev.7开发版本,可能存在未修复的bug。如果以上方案无效,建议尝试升级到最新稳定版Isar,或排查官方仓库的issue列表确认是否有已知问题。
内容的提问来源于stack exchange,提问作者Ali Gohar
相关产品推荐
相关产品推荐

