Flutter ObjectBox:属性转换器是否支持List<String>类型?
关于Flutter ObjectBox中List类型支持的疑问与解决
问题背景
ObjectBox官方文档说明:
ObjectBox(Java、Dart)内置支持String列表,Java版还支持String数组。
但在通过getter/setter转换自定义实体列表时,触发了如下警告:
[WARNING] objectbox_generator:resolver on lib/model/diary_day.dart: Skipping property 'doneExercises': type 'List' not supported, consider creating a relation for @Entity types, or replace with getter/setter converting to a supported type.
疑问:这是Bug还是对文档的误解?参考转换代码如下:
late List<DiaryExercise> doneExercises = []; List<String> get dbDoneExercises { List<String> retVal = []; for (DiaryExercise thisExercise in doneExercises) { retVal.add(jsonEncode(thisExercise.toJson())); } return retVal; } set dbDoneExercises(List<String> jsonStrings) { for (String thisJson in jsonStrings) DiaryExercise exercise = DiaryExercise.fromJson(jsonDecode(thisJson)); doneExercises.add(exercise); } }
解答:这是对文档的误解,并非Bug
文档中提到的「内置支持String列表」,指的是直接在@Entity类中声明List<String>类型字段并标记@Property()注解,ObjectBox会直接处理该类型的存储与读取。
你当前的问题根源在于:
- ObjectBox扫描到了未标记注解的
doneExercises字段,它是List<DiaryExercise>类型(自定义实体类的列表),ObjectBox不直接支持这种类型,因此抛出警告 - 用于转换的
dbDoneExercises字段没有标记@Property(),ObjectBox没有识别到这是需要存储的目标字段
修正方案
- 给
doneExercises加上@Transient()注解,告知ObjectBox忽略这个字段,不要对其进行扫描处理 - 给
dbDoneExercises加上@Property()注解,标记这是需要ObjectBox存储的字段
修正后的代码示例:
import 'package:objectbox/objectbox.dart'; @Entity() class DiaryDay { int id = 0; @Transient() // 让ObjectBox忽略该字段 late List<DiaryExercise> doneExercises = []; @Property() // 标记为需要存储的字段 List<String> get dbDoneExercises { List<String> retVal = []; for (DiaryExercise thisExercise in doneExercises) { retVal.add(jsonEncode(thisExercise.toJson())); } return retVal; } set dbDoneExercises(List<String> jsonStrings) { doneExercises.clear(); // 清空原有数据避免重复添加 for (String thisJson in jsonStrings) { DiaryExercise exercise = DiaryExercise.fromJson(jsonDecode(thisJson)); doneExercises.add(exercise); } } }
额外建议
如果DiaryExercise本身是@Entity类,更推荐使用ObjectBox的ToMany关系来实现,相比JSON序列化,这种方式能更好地利用ObjectBox的查询优化能力,代码也更简洁易维护。
内容的提问来源于stack exchange,提问作者SePröbläm
相关产品推荐
相关产品推荐

