如何将ConfiguracionModel对象属性批量赋值给SharedPreferences以简化冗余代码
Dart作为强类型静态语言,没有原生支持的跨对象批量同名属性赋值语法,你可以通过以下3种常用方案简化代码:
方案1:封装赋值逻辑到目标类方法(最推荐,类型安全)
直接在PreferenciasUsuario类中新增一个实例方法,把所有赋值逻辑统一收拢到类内部,外部调用只需一行:
// 往PreferenciasUsuario类里添加该方法 void syncFromConfig(ConfiguracionModel config) { idioma = config.idioma; medidaDistancia = config.medidaDistancia; medidaOxigeno = config.medidaOxigeno; medidaPeso = config.medidaPeso; medidaPesoUnidad = config.medidaPesoUnidad; medidaTemp = config.medidaTemp; // 剩余所有属性赋值统一写在这里即可 }
业务侧调用简化为:
final _prefs = PreferenciasUsuario(); final _configuracion = await configuracionBloc.cargarConfiguracion(_prefs.idEmpresa); // 一行完成所有赋值 _prefs.syncFromConfig(_configuracion);
优点:完全类型安全,编译阶段就能排查属性不匹配、类型错误的问题,后续修改属性映射只需改这一处即可。
方案2:JSON序列化中转(适合属性极多、已接入序列化框架的场景)
如果你的PreferenciasUsuario和ConfiguracionModel都已经用json_serializable这类框架实现了toJson/fromJson能力,可以通过JSON作为中间层完成批量赋值:
final _prefs = PreferenciasUsuario(); final _configuracion = await configuracionBloc.cargarConfiguracion(_prefs.idEmpresa); // 把config转成JSON,再用JSON生成新的prefs实例 final configJson = _configuracion.toJson(); // 注意:如果prefs里有config不存在的属性(比如示例里的idEmpresa),需要手动保留,避免被覆盖 configJson['idEmpresa'] = _prefs.idEmpresa; final newPrefs = PreferenciasUsuario.fromJson(configJson);
优点:不需要手动写逐行赋值代码,适合字段几十上百个的场景。
缺点:存在运行时风险,如果两个类的属性名、字段类型不匹配,不会在编译阶段报错,只会在运行时抛出异常。
方案3:扩展方法实现(适合无法修改原有类定义的场景)
如果因为代码权限、依赖关系等原因不能直接修改PreferenciasUsuario的源码,可以用Dart扩展方法收拢赋值逻辑:
// 定义扩展 extension PreferenciasUsuarioSync on PreferenciasUsuario { void updateFromConfig(ConfiguracionModel config) { idioma = config.idioma; medidaDistancia = config.medidaDistancia; // 其余属性赋值 } }
调用方式和方案1一致:_prefs.updateFromConfig(_configuracion)。
注意:不推荐用反射实现该需求,Flutter已禁用
dart:mirrors反射能力,第三方反射框架会导致包体积变大、打包混淆后容易出现未知异常,上述三种方案已经可以覆盖绝大多数使用场景。
内容的提问来源于stack exchange,提问作者David L
相关产品推荐
相关产品推荐

