前言
項目數據轉模型采用FlutterJsonBeanFactory進行處理,其中一個模型根據后臺返回的字段要處理文本中有[br] [wave]標簽的內容,如:
"[br][wave]閱讀是一種環境上的孤獨[/wave]。當我們捧讀一本書,徜徉在字里行間時,我們與文本對話,與書中人物對話,與作者對話,這時我們需要環境的清幽嘈雜的環境固然也能讀進去,但很難走出來閱讀需要一個寧靜溫馨的氛圍,一個無人打擾的“世外桃源”,[wave]曾記否,夜深人靜、細雨如絲的夜晚,我們坐在椅上,品一杯香茗,與書相擁,思緒在文字間游走,情感在文字間跌宕,這樣的夜晚是何等愜意!曾記否,在孤燈相伴的夜晚,讀孔孟言、悟李杜詩、品劉墉文、賞清玄章,積智慧之沙建文學之寶塔,感悟文學之純美,悟得人生之真諦的思路過程![/wave][br][wave]"
根據后臺字段替換掉文本中[br]
標簽轉為換行符號\n
標簽[wave]
包裹的內容轉為波浪線,因多個地方
使用文本字段
,考慮的思路類似iOS
中監聽Set
方法的時候使用自定義的字段進行替換,下面是實現過程:
思路1:
在模型內使用一個自定義的字段在轉模型的時候,進行處理賦值
代碼:
模型類代碼,其中contentHandling
為自定義的字段,接收處理后的文本
class ArticleLibraryModelData {
int? createTime = 0;
int? updateTime = 0;
int? id = 0;
String? title = '';
String? content = '';
//
String? contentHandling = "";
factory ArticleLibraryModelData.fromJson(Map<String, dynamic> json) => $ArticleLibraryModelDataFromJson(json);
Map<String, dynamic> toJson() => $ArticleLibraryModelDataToJson(this);
@override
String toString() {
return jsonEncode(this);
}
}
模型轉換方法內處理
ArticleLibraryModelData $ArticleLibraryModelDataFromJson(
Map<String, dynamic> json) {
final ArticleLibraryModelData articleLibraryModelData = ArticleLibraryModelData();
if (content != null) {
articleLibraryModelData.content = content;
// 在此處進行自定義的處理
articleLibraryModelData.contentHandling = content.replaceAll(RegExp(r'\[/?wave\]'), '').replaceAll('[br]', '\n');
}
}
結果:使用這種方式能夠實現想要的效果,但因是自動化生成的數據轉模型代碼,再次使用自動化轉換,自定義的處理會被覆蓋 方案無效
思路2:
在模型內使用一個自定義的字段,重寫get方法,使用計算屬性并緩存替換后的結果
class ArticleLibraryModelData {
int? createTime = 0;
int? updateTime = 0;
int? id = 0;
String? title = '';
String? content = '';
String? _contentHandling;
String? get contentHandling {
_contentHandling ??= content?.replaceAll(RegExp(r'\[/?wave\]'), '').replaceAll('[br]', '\n');
return _contentHandling;
}
}