Flutter?模型動態(tài)化賦值研究分析
一、需求來源
之前無論是做 iOS 開發(fā)還是 JS 開發(fā),模型動態(tài)賦值都是一個(gè)非常重要且高頻使用的特性。進(jìn)行 flutter 開發(fā)時(shí)需要用到這個(gè)特性但是不支持就感覺特別難受,遂想自己實(shí)現(xiàn)這個(gè)特性,中間經(jīng)過三個(gè)月的思考學(xué)習(xí),實(shí)現(xiàn)了一個(gè)初步方案(大家如果有更好的方案可以貼在評論里,共同進(jìn)步)。
二、實(shí)現(xiàn)思路
通過重載 [] 和 []= 運(yùn)算符,讓模型具備像字典一樣讀寫值的方式;
- 類中實(shí)現(xiàn)編碼和解碼方法備用:
/// 編碼 Map<String, Object?>toJson() /// 解碼 ... fromJson(Map<String, Object?>? map)
實(shí)現(xiàn)
1、在運(yùn)算符 [] 方法中用對象的編碼方法 toJson 獲取到對應(yīng)的 Map 讀取對應(yīng)屬性值即可;
2、在運(yùn)算符 []= 方法中對比傳入的 key,相同則賦值;
三、使用示例
var model = AppModel(
appIcon: "assets/icon_light_unselected.png",
appSize: "53.2M",
appName: "QQ音樂 - 讓生活充滿音樂",
appDate: "13:50",
appDescription: """【全新設(shè)計(jì) 純凈享受】
-重塑全新視覺,輕盈/純凈/無擾/為Mac系統(tǒng)量身設(shè)計(jì),從內(nèi)而外純凈享受;
-全新結(jié)構(gòu)設(shè)計(jì),整體交互優(yōu)化/人性化和易用性大提升,操作體驗(yàn)豪華升級";
""",
appVersion: "版本 7.6.0",
isShowAll: false
);
print("appName before: ${model["appName"]}");//appName before: QQ音樂 - 讓生活充滿音樂
model["appName"] = "哈哈哈哈";
print("appName after: ${model["appName"]}");//appName after: 哈哈哈哈
四、實(shí)現(xiàn)源碼
///升級模型
class AppModel {
AppModel({
this.appIcon = "-",
this.appSize = "-",
this.appName = "-",
this.appDate = "-",
this.appDescription = "-",
this.appVersion = "-",
this.isShowAll = false,
});
/// App圖標(biāo)
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;
}
}
}
總結(jié)
1、已經(jīng)初步實(shí)現(xiàn)了模型的屬性的動態(tài)化讀寫;
2、賦值操作符中的方法實(shí)現(xiàn)太繁瑣(沒有找到其他方法),改進(jìn)思考:通過 json 轉(zhuǎn)模型的插件二次開發(fā)自動生成如何?;
3、雖然已經(jīng)有了初步實(shí)現(xiàn),但是實(shí)現(xiàn)的方法還不完美不優(yōu)雅
以上就是Flutter 模型動態(tài)化賦值研究分析的詳細(xì)內(nèi)容,更多關(guān)于Flutter 模型動態(tài)化賦值的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
iOS開發(fā)之tableView實(shí)現(xiàn)左滑刪除功能
我們在使用一些應(yīng)用的時(shí)候,在滑動一些聯(lián)系人的某一行的時(shí)候,會出現(xiàn)刪除、置頂、更多等等的按鈕,下面這篇文章主要就介紹了iOS用tableView實(shí)現(xiàn)左劃刪除功能的方法,有需要的朋友們可以參考借鑒,下面來一起看看吧。2017-01-01
利用iOS手勢與scrollView代理實(shí)現(xiàn)圖片的放大縮小
這篇文章主要介紹了利用iOS的手勢、scrollView代理來實(shí)現(xiàn)圖片放大縮小的方法,文中通過示例代碼介紹的很詳細(xì),相信對各位iOS開發(fā)者們來說具有一定的參考借鑒價(jià)值,有需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧。2017-01-01
IOS 開發(fā)之UITextField的光標(biāo)操作擴(kuò)展
這篇文章主要介紹了IOS 開發(fā)之UITextField的光標(biāo)操作擴(kuò)展的相關(guān)資料,需要的朋友可以參考下2017-06-06
iOS 中使用tableView實(shí)現(xiàn)右滑顯示選擇功能
這篇文章主要介紹了iOS 中使用tableView實(shí)現(xiàn)右滑顯示選擇功能的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07
iOS開發(fā)實(shí)現(xiàn)搜索框(UISearchController)
這篇文章主要為大家詳細(xì)介紹了iOS開發(fā)實(shí)現(xiàn)搜索框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
IOS 粒子系統(tǒng) (CAEmitterLayer)實(shí)例詳解
這篇文章主要介紹了IOS 粒子系統(tǒng) (CAEmitterLayer)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-09-09
淺談強(qiáng)大易用支持URL Rewrite的iOS路由庫FFRouter
FRouter 是 iOS 中一個(gè)強(qiáng)大且易用的 URL 路由庫,支持 URL Rewrite,基于匹配查找 URL,效率高。非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-10-10

