You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Flutter Realm更新嵌套嵌入式对象时iOS应用崩溃求助

Flutter Realm更新嵌套嵌入式对象时iOS应用崩溃求助

各位大佬好,我在Flutter项目里用Realm存储复杂的嵌套数据,第一次插入完全没问题,但第二次用相同JSON结构更新时,iOS端直接崩溃了,折腾好久没找到原因,来求助大家!

问题重现步骤

  • 将JSON转换为Realm模型对象
  • 调用realm.writeAsync,通过realm.addAll([object], update: true)写入数据
  • 重复上述两步,使用完全相同的JSON数据
  • 第二次执行时iOS应用直接崩溃

环境信息

  • Realm版本:^20.1.1
  • Flutter版本:3.32.2
  • Dart版本:3.8.1
  • iOS系统版本:18.3
  • 使用本地Realm实例,所有iOS设备/系统均出现相同问题

数据规模说明

我插入的嵌套对象包含:

  • listOfConfigM:2条记录
  • activeConfig:总计38条记录(分布在所有listOfConfigM中)
  • paramsActive:总计629条记录(分布在所有activeConfig中)

Realm模型定义

@RealmModel()
class $ConfigurationSchema {
  @PrimaryKey()
  late String name;
  late ConfigurationType? configType;
  late DateTime? lastModified;
  late DateTime? lastUpdated;
}

@RealmModel(ObjectType.embeddedObject)
class $ConfigurationType {
  late String? type;
  late MyConfituration? myConfiguration;
}

@RealmModel(ObjectType.embeddedObject)
class $MyConfituration {
  late List<$ConfigM> listOfConfigM;
}

@RealmModel(ObjectType.embeddedObject)
class $ConfigM {
  late String id;
  late String? name;
  late List<$ActiveConfig> activeConfig;
}

@RealmModel(ObjectType.embeddedObject)
class $ActiveConfig {
  late String id;
  late String? name;
  late String? type;
  late List<$PararamActive> paramsActive;
}

@RealmModel(ObjectType.embeddedObject)
class $PararamActive {
  late String id;
  late String? name;
  late RealmValue value;
}

示例JSON数据

{
  "name": "simpleConfig",
  "configType": {
    "type": "myConfiguration",
    "myConfiguration": {
      "listOfConfigM": [
        {
          "id": "1",
          "name": "Config1",
          "activeConfig": [
            {
              "id": "1.1",
              "name": "ActiveConfig1",
              "type": "TypeA",
              "paramsActive": [
                {
                  "id": "1.1.1",
                  "name": "Param1",
                  "value": {
                    "stringValue": "Value1"
                  }
                },
                {
                  "id": "1.1.2",
                  "name": "Param2",
                  "value": false
                },
                {
                  "id": "1.1.3",
                  "name": "Param3",
                  "value": ["hello", "world"]
                }
              ]
            }
          ]
        },
        {
          "id": "2",
          "name": "Config2",
          "activeConfig": [
            {
              "id": "2.1",
              "name": "ActiveConfig2",
              "type": "TypeB",
              "paramsActive": [
                {
                  "id": "2.1.1",
                  "name": "Param2",
                  "value": 0
                }
              ]
            }
          ]
        }
      ]
    }
  },
  "lastModified": "2025-06-12T08:30:00.000Z",
  "lastUpdated": "2025-06-12T08:30:00.000Z"
}

插入/更新代码片段

var confMap = jsonDecode(simpleConfigJson);
var configurationSchema = ConfigurationSchema(
  name: confMap['name'],
  configType: ConfigurationType(
    type: confMap['configType']['type'],
    myConfiguration: MyConfituration(
      listOfConfigM: (confMap['configType']['myConfiguration']['listOfConfigM'] as List)
          .map((item) => ConfigM(
                id: item['id'],
                name: item['name'],
                activeConfig: (item['activeConfig'] as List)
                    .map((activeItem) => ActiveConfig(
                          id: activeItem['id'],
                          name: activeItem['name'],
                          type: activeItem['type'],
                          paramsActive: (activeItem['paramsActive'] as List)
                              .map((param) => PararamActive(
                                    id: param['id'],
                                    name: param['name'],
                                    value: RealmValue.fromJson(param['value'])
                                  )).toList()
                        )).toList()
              )).toList()
  ),
  lastModified: DateTime.parse(confMap['lastModified']),
  lastUpdated: DateTime.parse(confMap['lastUpdated'])
);

realm.writeAsync(() {
  realm.addAll([configurationSchema], update: true);
});

预期结果

  • 第一次插入成功存储数据
  • 第二次用update: true执行时,应该更新已有对象,而非崩溃

我怀疑崩溃和对象的大小或者嵌套结构有关,但实在找不到具体原因,有没有遇到过类似问题的大佬给点思路?

内容来源于stack exchange

火山引擎 最新活动