如何编写通用函数支持不同Model作为入参,无需为每个Model单独写函数?
解决方案
完全不需要为每个Model单独编写处理函数,只需要做少量改造即可实现通用函数适配所有Model场景,具体改造步骤如下:
步骤1:统一Model序列化约束
首先定义一个通用的BaseModel抽象类,要求所有需要参与JSON序列化的Model都实现该接口,确保每个Model都有统一的toJson方法:
abstract class BaseModel { // 约束所有Model必须实现toJson方法返回可序列化的Map结构 Map<String, dynamic> toJson(); } // 原有Model改造示例 class ScheduleModel implements BaseModel { // 原有属性代码不变 String? arrivalDate; // ...其他属性 @override Map<String, dynamic> toJson() { // 原有序列化逻辑,把你之前的toJsonn方法改成统一的toJson即可 return { "arrivalDate": arrivalDate, // ...其他字段映射 }; } } class RoutesModel implements BaseModel { // 原有属性代码不变 @override Map<String, dynamic> toJson() { // 原有序列化逻辑 return { // ...对应字段映射 }; } }
步骤2:改造通用JSON转换函数
把原来固定入参为ScheduleModel的转换函数改成接收BaseModel类型,适配所有符合约束的Model:
static String toJsonConversion(BaseModel data) { final jsonData = data.toJson(); return json.encode(jsonData); }
步骤3:封装通用请求函数
把公共的请求逻辑抽成通用函数,把可变的请求路径、Model实例、自定义特殊逻辑作为入参传入:
static Future<bool> commonUpdate( // 可变参数1:对应接口的后缀路径 String apiPath, // 可变参数2:任意符合BaseModel约束的Model实例 BaseModel data, // 可选参数:不同接口需要的特殊自定义逻辑,比如之前的打印操作 {void Function(BaseModel data)? customLogic} ) async { final response = await client.put( Uri.parse('$mainAPI$apiPath'), headers: {"content-type": "application/json"}, body: toJsonConversion(data), ); // 执行传入的自定义逻辑 if (customLogic != null) { customLogic(data); } return response.statusCode == 200; }
调用示例
后续新增任何Model和接口都不需要再写重复的请求逻辑,直接调用通用函数即可:
// 调用更新日程接口 bool scheduleResult = await commonUpdate( scheduleAPI, scheduleModelInstance, customLogic: (data) => print((data as ScheduleModel).arrivalDate) ); // 调用更新路线接口 bool routeResult = await commonUpdate(routesAPI, routeModelInstance);
补充说明
如果不想定义基类约束,也可以直接用dynamic类型作为入参,但是非常不推荐,这种写法没有编译时类型校验,如果某个Model没有实现toJson方法,只会在运行时报错,排查成本很高。
如果后续需要适配POST/DELETE等其他请求方式,只需要在通用函数中新增请求方法的入参即可,扩展成本极低。
内容的提问来源于stack exchange,提问作者Danny
相关产品推荐
相关产品推荐

