Flutter?模型動(dòng)態(tài)化賦值研究分析
一、需求來(lái)源
之前無(wú)論是做 iOS 開(kāi)發(fā)還是 JS 開(kāi)發(fā),模型動(dòng)態(tài)賦值都是一個(gè)非常重要且高頻使用的特性。進(jìn)行 flutter 開(kāi)發(fā)時(shí)需要用到這個(gè)特性但是不支持就感覺(jué)特別難受,遂想自己實(shí)現(xiàn)這個(gè)特性,中間經(jīng)過(guò)三個(gè)月的思考學(xué)習(xí),實(shí)現(xiàn)了一個(gè)初步方案(大家如果有更好的方案可以貼在評(píng)論里,共同進(jìn)步)。
二、實(shí)現(xiàn)思路
通過(guò)重載 [] 和 []= 運(yùn)算符,讓模型具備像字典一樣讀寫(xiě)值的方式;
- 類(lèi)中實(shí)現(xiàn)編碼和解碼方法備用:
/// 編碼 Map<String, Object?>toJson() /// 解碼 ... fromJson(Map<String, Object?>? map)
實(shí)現(xiàn)
1、在運(yùn)算符 [] 方法中用對(duì)象的編碼方法 toJson 獲取到對(duì)應(yīng)的 Map 讀取對(duì)應(yīng)屬性值即可;
2、在運(yùn)算符 []= 方法中對(duì)比傳入的 key,相同則賦值;
三、使用示例
var model = AppModel(
appIcon: "assets/icon_light_unselected.png",
appSize: "53.2M",
appName: "QQ音樂(lè) - 讓生活充滿音樂(lè)",
appDate: "13:50",
appDescription: """【全新設(shè)計(jì) 純凈享受】
-重塑全新視覺(jué),輕盈/純凈/無(wú)擾/為Mac系統(tǒng)量身設(shè)計(jì),從內(nèi)而外純凈享受;
-全新結(jié)構(gòu)設(shè)計(jì),整體交互優(yōu)化/人性化和易用性大提升,操作體驗(yàn)豪華升級(jí)";
""",
appVersion: "版本 7.6.0",
isShowAll: false
);
print("appName before: ${model["appName"]}");//appName before: QQ音樂(lè) - 讓生活充滿音樂(lè)
model["appName"] = "哈哈哈哈";
print("appName after: ${model["appName"]}");//appName after: 哈哈哈哈
四、實(shí)現(xiàn)源碼
///升級(jí)模型
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)了模型的屬性的動(dòng)態(tài)化讀寫(xiě);
2、賦值操作符中的方法實(shí)現(xiàn)太繁瑣(沒(méi)有找到其他方法),改進(jìn)思考:通過(guò) json 轉(zhuǎn)模型的插件二次開(kāi)發(fā)自動(dòng)生成如何?;
3、雖然已經(jīng)有了初步實(shí)現(xiàn),但是實(shí)現(xiàn)的方法還不完美不優(yōu)雅
以上就是Flutter 模型動(dòng)態(tài)化賦值研究分析的詳細(xì)內(nèi)容,更多關(guān)于Flutter 模型動(dòng)態(tài)化賦值的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
iOS SwiftUI 顏色漸變填充效果的實(shí)現(xiàn)
這篇文章主要介紹了iOS SwiftUI 顏色漸變填充效果的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
iOS 委托與文本輸入(內(nèi)容根據(jù)iOS編程編寫(xiě))
這篇文章主要介紹了iOS 委托與文本輸入(內(nèi)容根據(jù)iOS編程編寫(xiě)) 的相關(guān)資料,需要的朋友可以參考下2016-09-09
iOS開(kāi)發(fā)網(wǎng)絡(luò)編程之?dāng)帱c(diǎn)續(xù)傳
在下載較大的文件的時(shí)候,一次不能下載完畢,這就需要用到斷點(diǎn)續(xù)傳,那么在IOS開(kāi)發(fā)中該如何實(shí)現(xiàn)呢,下面跟著小編一起通過(guò)本文來(lái)學(xué)習(xí)下。2016-08-08
IOS中實(shí)現(xiàn)圖片點(diǎn)擊全屏預(yù)覽
IOS作為一款智能手機(jī)系統(tǒng),在查看圖片的時(shí)候,如果能夠?qū)崿F(xiàn)全屏,對(duì)用戶來(lái)說(shuō)有很好的視覺(jué)體驗(yàn),其實(shí)實(shí)現(xiàn)起來(lái)非常的簡(jiǎn)單,下面我就結(jié)合一個(gè)簡(jiǎn)單的代碼給大家來(lái)分享一下,,需要的朋友可以參考下2015-11-11
IOS正則表達(dá)式之驗(yàn)證密碼身份證手機(jī)號(hào)
這篇文章主要介紹了IOS正則表達(dá)式之驗(yàn)證密碼身份證手機(jī)號(hào)的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-10-10
iOS APP實(shí)現(xiàn)微信H5支付示例總結(jié)
這篇文章主要介紹了iOS APP實(shí)現(xiàn)微信H5支付示例總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02

