悦大夫蓝欣 發表於 2023-3-13 14:08:53

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

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>一、需求来源</li><li>二、实现思路</li><li>三、使用示例</li><li>四、实现源码</li><li>总结</li></ul></div><p class="maodian"></p><h2>一、需求来源</h2>
<div class="cros igoods"><div class="goodsin" data-img="https://img14.360buyimg.com/pop/jfs/t1/148276/5/27642/443135/628488e3Ef7980fcd/74f11b04481b069b.jpg" data-name="Flutter组件详解与实战" data-owner="京东自营" data-price="38.15" data-tgid="38" data-url="https://union-click.jd.com/jdc?e=&amp;p=JF8BALUJK1olXDYAVVddCkISC19MRANLAjZbERscSkAJHTdNTwcKBlMdBgABFkkWCm8KEl4dQl9HCANtVCxXBi1pGit1OVIKMR87VzhsczhTXVcZbQEHU1tVCk4UM28LHVwVXAMCZG5dCXtcbW44GmsVWgALU1dbD0wfC2kLK1sdWTZBABsJSwhfM184GGslbQYyV24DZkpEC28OGAkcM1tVUwkNVwNJbWwMGlsXWAULXG5fCUoVAV84"></div></div>
<p>之前无论是做 iOS 开发还是 JS 开发,模型动态赋值都是一个非常重要且高频使用的特性。进行 flutter 开发时需要用到这个特性但是不支持就感觉特别难受,遂想自己实现这个特性,中间经过三个月的思考学习,实现了一个初步方案(大家如果有更好的方案可以贴在评论里,共同进步)。</p>
<p class="maodian"></p><h2>二、实现思路</h2>
<p>通过重载 [] 和 []= 运算符,让模型具备像字典一样读写值的方式;</p>
<ul><li>类中实现编码和解码方法备用:</li></ul>
<div class="jb51code"><pre class="brush:java;">/// 编码
Map&lt;String, Object?&gt;toJson()
/// 解码
... fromJson(Map&lt;String, Object?&gt;? map)
</pre></div>
<p>实现</p>
<p>1、在运算符 [] 方法中用对象的编码方法 toJson 获取到对应的 Map 读取对应属性值即可;</p>
<p>2、在运算符 []= 方法中对比传入的 key,相同则赋值;</p>
<p class="maodian"></p><h2>三、使用示例</h2>
<div class="jb51code"><pre class="brush:java;">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: 哈哈哈哈
</pre></div>
<p class="maodian"></p><h2>四、实现源码</h2>
<div class="jb51code"><pre class="brush:java;">///升级模型
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&lt;String, Object?&gt;? 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&lt;String, Object?&gt;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;
      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;
      }
    }
}
</pre></div>
<p class="maodian"></p><h2>总结</h2>
<p>1、已经初步实现了模型的属性的动态化读写;</p>
<p>2、赋值操作符中的方法实现太繁琐(没有找到其他方法),改进思考:通过 json 转模型的插件二次开发自动生成如何?;</p>
<p>3、虽然已经有了初步实现,但是实现的方法还不完美不优雅</p>
<p>以上就是Flutter 模型动态化赋值研究分析的详细内容,更多关于Flutter 模型动态化赋值的资料请关注琼殿技术社区其它相关文章!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>MaterialApp Flutter 应用全局配置与主题管理详解</li><li>flutter 常见圆角处理示例详解</li><li>Flutter高级玩法Flow位置自定义</li><li>Flutter Flow实现滑动显隐层示例详解</li><li>Flutter&nbsp;Component动画的显和隐最佳实践</li><li>Flutter LinearProgressIndicator使用指南分析</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: Flutter 模型动态化赋值研究分析