Flutter Realm v1.3.0灵活同步下关联事件列表为空问题排查
问题原因及解决办法
1. 模型定义错误:嵌入式对象不能拥有主键与反向关联
你的Event模型被作为Meeting的列表属性(List<_Event>),这意味着Event是Realm嵌入式对象,但嵌入式对象有明确限制:
- 不能定义
@PrimaryKey(),嵌入式对象无独立身份,完全依附于父对象 - 不能使用
@Backlink(),反向关联仅适用于独立对象间的引用关系
修正方案(二选一)
方案1:保持Event为嵌入式对象
移除Event的主键与反向关联:
@RealmModel() class _Meeting { @PrimaryKey() @MapTo('_id') late ObjectId id; String? description; late List<_Event> events; } @RealmModel() class _Event { // 移除主键定义 late String name; // 移除反向关联定义 }
方案2:将Event设为独立可引用对象
如果需要Event被多个Meeting共享,改用对象引用方式,同时确保Atlas中Event是独立集合:
@RealmModel() class _Meeting { @PrimaryKey() @MapTo('_id') late ObjectId id; String? description; // 引用独立的Event对象 late List<Event> events; } @RealmModel() class _Event { @PrimaryKey() @MapTo('_id') late ObjectId id; late String name; @Backlink(#events) late Iterable<Meeting> linkedMeeting; }
2. 灵活同步的权限与数据同步状态
- 检查Atlas灵活同步的权限规则,确保当前用户同时拥有
Meeting和Event的读取权限,否则同步时不会拉取关联的Event数据。 initState中直接获取数据可能遇到同步未完成的情况,本地缓存还未拿到最新关联数据。可以通过Realm的实时订阅监听数据变化:
late RealmResultsSubscription<Meeting> _subscription; @override void initState() { super.initState(); final meetingId = ObjectId.fromHexString(widget.meetingId); _subscription = realm.query<Meeting>('_id == $0', [meetingId]).listen((results) { if (results.isNotEmpty) { setState(() { _meeting = results.first; _events = _meeting.events.toList(); }); } }); } @override void dispose() { _subscription.cancel(); super.dispose(); }
3. 避免静态List丢失实时性
Realm的List是实时同步的,但调用toList()转为普通List后会变成静态数据。如果要保持数据实时更新,可直接用Realm List构建ListView:
ListView.builder( shrinkWrap: true, itemCount: _meeting?.events.length ?? 0, itemBuilder: (context, index) { final event = _meeting!.events[index]; return ListTile(title: Text(event.name)); }, )
内容的提问来源于stack exchange,提问作者dondragon2
相关产品推荐
相关产品推荐

