Flutter 模型动态化赋值研究分析

 更新时间:2023年03月13日 14:08:53   作者:SoaringHeart  
这篇文章主要为大家介绍了Flutter 模型动态化赋值研究分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

一、需求来源

之前无论是做 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 模型动态化赋值的资料请关注脚本之家其它相关文章!

相关文章

  • IOS安装CocoaPods详细教程

    IOS安装CocoaPods详细教程

    这篇文章主要为大家详细介绍了IOS安装CocoaPods教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • 最新ios面试试题以及解决思路分析

    最新ios面试试题以及解决思路分析

    本篇内容给大家整理了关于IOS程序员面试的试题以及相关解决方法,需要的朋友们参考一下吧。
    2017-12-12
  • iOS实现淘宝上拉进入详情页交互效果

    iOS实现淘宝上拉进入详情页交互效果

    最近遇到一个项目,项目中某个新需求的交互要求仿照淘宝上拉从下往上弹出宝贝详情。所以死打开淘宝APP仔细看了看,然后自己写了写,现在感觉效果差不多了,记录一下分享给大家,方法自己和大家需要的时候查看借鉴,感兴趣的朋友们下面跟着小编一起来学习学习吧。
    2016-11-11
  • iOS中关于Taptic-Engine震动反馈的深入解析

    iOS中关于Taptic-Engine震动反馈的深入解析

    这篇文章主要给大家介绍了关于iOS中关于Taptic-Engine震动反馈的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-11-11
  • iOS 控件封装(又名拧螺丝)之排序按钮的开发

    iOS 控件封装(又名拧螺丝)之排序按钮的开发

    排序按钮是实际开发中比较常见的一种控件,这篇文章主要介绍了iOS 开发之排序按钮,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • iOS开发之1行代码实现缓存计算及清除缓存

    iOS开发之1行代码实现缓存计算及清除缓存

    这篇文章主要给大家介绍了关于iOS开发之1行代码实现缓存计算及清除缓存的相关资料,文中通过示例代码介绍的非常详细,对各位iOS开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-05-05
  • iOS 12适配以及问题小记

    iOS 12适配以及问题小记

    苹果官方在上个月推送了iOS12系统,作为一名开发者当然要紧跟更新技术,所以下面这篇文章主要给大家介绍了关于iOS 12适配以及一些问题,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-07-07
  • iOS开发之App主题切换解决方案完整版(Swift版)

    iOS开发之App主题切换解决方案完整版(Swift版)

    这篇文章主要为大家详细介绍了iOS开发之App主题切换完整解决方案,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • iOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自己对未知的好奇心,还经常能发现一些意外的惊喜。这篇文章主要介绍了iOS通过逆向如何深入理解Block内存模型的相关资料。
    2017-01-01
  • IOS设置UIView的边框为圆角详解及实例

    IOS设置UIView的边框为圆角详解及实例

    这篇文章主要介绍了IOS设置UIView的边框为圆角的相关资料,需要的朋友可以参考下
    2017-03-03

最新评论