相信做Flutter开辟的小同伴们曾经都有如许的痛楚,接口明显是联调OK的,怎么提测以后接口就出题目了,有一种环境是如许的,配景哥们很不负责任的调解了字段范例,大概修改了字段名,再大概缺少了原有返回的字段。
起首看下,相信各人正常都是如许分析json的
//假如已经获取到了从配景的responseMap<String, dynamic> json = [];//分析String值与int值String nickname = json["nickname"];int userId = json["userId"];这种写法,假如配景没有返回nickname字段,大概userId配景返回的是字符串范例,这里json分析就会报错,flutter不像原生分析一样有json.optString大概json.optInt如许的方法,固然在flutter中map也有containsKey方法,判断该字段是否存在,岂非.....我要对每个字段举行判断吗?假如非要我如许做,我会把配景杀了。
有没有什么方法可以像原生Android一样分析,直接json.optString()一样处理处罚,实时配景没有返回该字段,大概数据范例对不上,app这边依然可以正常运行,不会步调报错,答案是有的,那就是extension method处理处罚,实现map的扩展函数(getString,getInt,getBool)如许的方法,然后在内里自己举行容错处理处罚即可)java是不能实现扩展函数的,kotlin与flutter却可以,废话不多说,直接上代码吧。
/** * 扩展工具类 */extension ExtensionUtils on Map { /** * 返回一个int值 */ int getInt(String key, {int defValue = 0}) { try { if (containsKey(key)) { var value = this[key]; if (null == value) { return defValue; } else if (value is String) { return int.parse(value); } return value; } } on Exception { } catch (e) {} return defValue; } /** * 返回一个String值 */ String getString(String key, {String defValue = ""}) { try { if (containsKey(key)) { var value = this[key]; if (null == value) { return defValue; } else if (value is int) { return value.toString(); } return this[key]; } } on Exception { } catch (e) {} return defValue; } /** * 返回一个map */ Map<String, dynamic> getMap(String key) { try { if (containsKey(key)) { return this[key]; } } on Exception { } catch (e) {} return {}; } /** * 返回一个对象 */ T getObject<T>(String key, T Function(Map<String, dynamic>) parseModel) { try { if (this.containsKey(key) && null != this[key]) { return parseModel(this[key]); } else { return parseModel({}); } } on Exception { return parseModel({}); } } /** * 分析list */ List<T> getList<T>(String key, T Function(dynamic data) parseModel) { try { List list = this[key] ?? []; List<T> datas = list.map((e) => parseModel(e)).toList(); return datas; } on Exception { return []; } }}末了看下我是怎样调用的
分析int,String
import 'package:app_flutter/utils/extensions_utils.dart';class Shift { String? endTime; int? groupId; String? workStatus; //WORKING:值班中, RESTING:苏息中,HANDOVER_WORK: 交班, RECEIVING_WORK: 交班 String? workStatusDesc; Shift.fromJson(Map<String, dynamic> json) { endTime = json.getString("endTime"); groupId = json.getInt("groupId"); workStatus = json.getString("workStatus"); workStatusDesc = json.getString("workStatusDesc"); }}分析object对象与分析list数组
import 'package:app_flutter/utils/extensions_utils.dart';import 'message_ext.dart';/** * 未读消息体 */class MessageNotify { late String content;// 内容 string late MessageExt ext;// 扩展数据 object late String id;// id string late int isRead;// 是否已读(0:否,1:是) integer late String msgId;// 消息id integer late String recId;// 吸收者id string late List<String> tags;// 标签数组 array string late String time;// 时间 string late String title;// 标题 MessageNotify.from(Map<String, dynamic> map){ content = map.getString("content"); ext = map.getObject("ext", (data){ return MessageExt.from(data);}); id = map.getString("id"); isRead = map.getInt("isRead"); msgId = map.getString("msgId"); recId = map.getString("recId"); tags = map.getList("tags", (item){return item.toString();}); time = map.getString("time"); title = map.getString("title"); }}增补下MessageExt.dart类
import 'package:app_flutter/constant/asset_path_constant.dart';import 'package:app_flutter/utils/extensions_utils.dart';/** * 未读消息-扩展字段 */class MessageExt { late int msgType; //: 0变乱,1待办,2逾期,3临期 late String typeId; //: 变乱ID或工单ID late String businessId;// 业务ID,当type为 3,4的时间,该字段有值 late int type; //: 0告警变乱,1报修变乱,2告警工单,3保养工单,4巡检工单,5维修工单 late String msgTip; //:严峻,巡检,维保,告警处理 late String msgIcon; //: 图标路径 MessageExt.from(Map<String, dynamic> map) { msgType = map.getInt("msgType"); typeId = map.getString("typeId"); type = map.getInt("type"); msgTip = map.getString("msgTip"); msgIcon = map.getString("msgIcon"); businessId = map.getString("businessId"); }}此工具类一出,方便了组内的其他小同伴,老大直接给我call了波666,其时搞的我都飘了。 |