一、需求来源
之前无论是做 iOS 开发还是 JS 开发,模型动态赋值都是一个非常重要且高频使用的特性。进行 flutter 开发时需要用到这个特性但是不支持就感觉特别难受,遂想自己实现这个特性,中间经过三个月的思考学习,实现了一个初步方案(大家如果有更好的方案可以贴在评论里,共同进步)。
二、实现思路
通过重载 [] 和 []= 运算符,让模型具备像字典一样读写值的方式;
- 类中实现编码和解码方法备用:
/// 编码 Map<String, Object?>toJson() /// 解码 ... fromJson(Map<String, Object?>? map)
实现
1、在运算符 [] 方法中用对象的编码方法 toJson 获取到对应的 Map 读取对应属性值即可;
2、在运算符 []= 方法中对比传入的 key,相同则赋值;
三、使用示例
var model = AppModel( appIcon: "assets/icon_light_unselected.png", appSize: "53.2M", appName: "QQ音乐 - 让生活充满音乐", appDate: "13:50", appDescription: """【全新设计 纯净享受】 -重塑全新视觉,轻盈/纯净/无扰/为Mac系统量身设计,从内而外纯净享受; -全新结构设计,整体交互优化/人性化和易用性大提升,操作体验豪华升级"; """, appVersion: "版本 7.6.0", isShowAll: false ); print("appName before: ${model["appName"]}");//appName before: QQ音乐 - 让生活充满音乐 model["appName"] = "哈哈哈哈"; print("appName after: ${model["appName"]}");//appName after: 哈哈哈哈
四、实现源码
///升级模型 class AppModel { AppModel({ this.appIcon = "-", this.appSize = "-", this.appName = "-", this.appDate = "-", this.appDescription = "-", this.appVersion = "-", this.isShowAll = false, }); /// App图标 String appIcon; /// App名称 String appName; /// App大小 String appSize; /// App更新日期 String appDate; /// App更新文案 String appDescription; /// App版本 String appVersion; /// App更新文案 bool isShowAll; static AppModel? fromJson(Map<String, Object?>? map) { if (map == null) { return null; } return AppModel( appIcon: map["appIcon"].toString(), appSize: map["appSize"].toString(), appName: map["appName"].toString(), appDate: map["appDate"].toString(), appDescription: map["appDescription"].toString(), appVersion: map["appVersion"].toString(), isShowAll: map["isShowAll"] as bool, ); } Map<String, Object?>toJson() { return { "appIcon": this.appIcon, "appSize": this.appSize, "appName": this.appName, "appDate": this.appDate, "appDescription": this.appDescription, "appVersion": this.appVersion, "isShowAll": this.isShowAll, }; } Object? operator [](String key){ final map = this.toJson(); final result = map[key]; return result; } void operator []=(String key, dynamic value){ switch (key) { case "appName": this.appName = value; break; case "appIcon": this.appIcon = value; break; case "appSize": this.appSize = value; break; case "appName": this.appName = value; break; case "appDate": this.appDate = value; break; case "appDescription": this.appDescription = value; break; case "appVersion": this.appVersion = value; break; case "isShowAll": this.isShowAll = value; break; default: break; } } }
总结
1、已经初步实现了模型的属性的动态化读写;
2、赋值操作符中的方法实现太繁琐(没有找到其他方法),改进思考:通过 json 转模型的插件二次开发自动生成如何?;
3、虽然已经有了初步实现,但是实现的方法还不完美不优雅
以上就是Flutter 模型动态化赋值研究分析的详细内容,更多关于Flutter 模型动态化赋值的资料请关注好代码网其它相关文章!