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

Flutter ObjectBox使用问题:如何存储实体类中的Map类型属性?

问题原因

你使用的对象持久化框架(从@Entity注解判断为ObjectBox)默认不支持直接持久化Map类型字段,未做特殊配置时会直接忽略该字段的存储操作,因此其余基础类型字段存储正常,仅Map字段读取为空。同时注意你的代码存在笔误:类名为PossessionStats,但构造函数命名为CardPossessionStats,需要修正避免出现编译问题。

解决方案

通过自定义类型转换器将Map序列化为JSON字符串存储,读取时再反序列化为Map即可,具体操作如下:

  1. 实现自定义转换器
import 'dart:convert';
import 'package:objectbox/objectbox.dart';

class MapStringIntConverter extends Converter<Map<String, int>?, String?> {
  @override
  Map<String, int>? fromDatabase(String? dbValue) {
    if (dbValue == null || dbValue.isEmpty) return null;
    return Map<String, int>.from(jsonDecode(dbValue));
  }

  @override
  String? toDatabase(Map<String, int>? value) {
    if (value == null) return null;
    return jsonEncode(value);
  }
}
  1. 给Map字段添加转换器注解,修正实体类笔误
@JsonSerializable()
@Entity()
class PossessionStats {
  @JsonKey(defaultValue: 0)
  int id;
  String cardUuid;
  int total;

  @Convert(converter: MapStringIntConverter)
  Map<String, int>? totalByVersion;

  PossessionStats({
    this.id = 0,
    required this.cardUuid,
    this.total = 0,
    this.totalByVersion,
  });
}
  1. 重新生成框架绑定代码
    执行以下命令重新生成持久化框架的关联代码:
    dart run build_runner build

配置完成后重新运行项目,Map字段即可正常持久化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 21:36:03