Flutter Hive:修改偏好对象字段无法触发Setter自动写入DB求助
解决Flutter Hive偏好设置自动持久化问题
问题根源
你直接修改preferencesData实例的字段(如preferences.UIappSize = 5.0)时,并未触发Hive的持久化逻辑——只有调用Box.put()或HiveObject的save()方法,Hive才会将数据写入磁盘。当前的preferences setter仅在给整个对象赋值时生效,修改单个字段不会走这个逻辑。
解决方案一:给字段添加自定义Setter(推荐)
由于你的preferencesData继承了HiveObject,自带save()方法,只需在字段的setter中更新值后调用该方法,即可自动同步到数据库,完全符合你“像操作普通对象一样修改偏好”的需求。
修改preferencesData类的字段定义,以UIappSize为例:
@HiveType(typeId: 5) class preferencesData extends HiveObject{ // ...其他字段保持不变 @HiveField(7) double _UIappSize = 1.0; // 自定义getter和setter double get UIappSize => _UIappSize; set UIappSize(double value) { _UIappSize = value; save(); // 自动调用Hive持久化方法 print('Preferences set'); } // 对所有需要自动保存的字段(如UItextSize、dersModu等)重复此操作 // ... }
解决方案二:封装修改逻辑(可选)
如果不想给每个字段都写setter,可以在单例中封装一个统一的修改方法,通过回调修改字段后自动保存:
// 单例部分新增方法 void updatePreferences(void Function(preferencesData) updateFn) { updateFn(_preferences!); preferencesDatabase.put('0', _preferences!); print('Preferences set'); } // 业务代码中调用 preferences.updatePreferences((prefs) { prefs.UIappSize = 5.0; });
优化单例实现
你当前的late final _preferences与null检查存在逻辑冲突,late final初始化后无法为null,建议修改为更安全的写法:
preferencesData? _preferences; preferencesData get preferences { _preferences ??= preferencesDatabase.get('0', defaultValue: preferencesData(datatypeVersion: appVersion, creationTime: DateTime.now()))!; print('Preferences read'); return _preferences!; }
测试效果
修改后执行preferences.UIappSize = 5.0; print(preferences.UIappSize);,输出会符合你的预期:
Preferences read Preferences set Preferences read 5.0
补充说明
HiveObject.save()方法会自动将当前对象同步到所属的Box中,无需手动调用Box.put()——只要你的实例是从Box中取出,或是初始化后已存入Box,该方法就能正常工作。
内容的提问来源于stack exchange,提问作者dnzssrl
相关产品推荐
相关产品推荐

