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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 08:35:19