Flutter Isar数据库不支持TimeOfDay类型的替代方案咨询
在Isar v3中处理TimeOfDay字段的替代方案
方案1:结合现有JSON序列化用@JsonConverter注解
Isar v3支持通过json_serializable的转换器来处理自定义类型,刚好你已有JSON序列化能力,可以直接复用:
- 实现
TimeOfDay与字符串的转换转换器:
class TimeOfDayConverter implements JsonConverter<TimeOfDay, String> { const TimeOfDayConverter(); @override TimeOfDay fromJson(String json) { final parts = json.split(':'); return TimeOfDay(hour: int.parse(parts[0]), minute: int.parse(parts[1])); } @override String toJson(TimeOfDay object) { return '${object.hour.toString().padLeft(2, '0')}:${object.minute.toString().padLeft(2, '0')}'; } }
- 在Isar模型的
TimeOfDay字段上添加该转换器注解:
@Collection() class YourModel { Id id = Isar.autoIncrement; @TimeOfDayConverter() TimeOfDay? scheduledTime; }
- 确保
build.yaml中启用Isar的JSON序列化支持:
targets: $default: builders: isar_generator: options: json_serializable: true
方案2:拆分字段原生存储
把TimeOfDay拆成Isar原生支持的int类型字段,通过封装的getter/setter来实现TimeOfDay的读写:
@Collection() class YourModel { Id id = Isar.autoIncrement; int? _hour; int? _minute; TimeOfDay? get scheduledTime { if (_hour == null || _minute == null) return null; return TimeOfDay(hour: _hour!, minute: _minute!); } set scheduledTime(TimeOfDay? time) { _hour = time?.hour; _minute = time?.minute; } }
这种方式无需额外依赖,读写效率更高,适合对性能有要求的场景。
方案3:手动字符串转换存储
和你之前用Hive的逻辑类似,直接将TimeOfDay转成字符串存在Isar的String字段,通过计算属性处理转换:
@Collection() class YourModel { Id id = Isar.autoIncrement; String? _timeString; TimeOfDay? get scheduledTime { if (_timeString == null) return null; final parts = _timeString!.split(':'); return TimeOfDay(hour: int.parse(parts[0]), minute: int.parse(parts[1])); } set scheduledTime(TimeOfDay? time) { if (time == null) { _timeString = null; } else { _timeString = '${time.hour.toString().padLeft(2, '0')}:${time.minute.toString().padLeft(2, '0')}'; } } }
该方式逻辑直接,完全匹配你之前的使用习惯,无需引入新工具。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

