Files
ln-ios/ln_jq_app/lib/common/model/base_model.dart
2025-11-12 18:02:04 +08:00

80 lines
2.5 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/// 通用的 API 响应基础模型
/// 使用泛型 <T> 来适应 'data' 字段中任何可能的数据类型
class BaseModel<T> {
final int code; // 状态码0正常其他异常
final bool status; // 状态布尔值true正常false异常
final String message; // 消息,例如 "success"
final String msg; // 消息,例如 "success"
final T? data; // 核心数据,使用泛型 T可以是任何类型
final int time; // 时间戳
final dynamic error; // 错误信息,可以是任何类型或 null
BaseModel({
required this.code,
required this.status,
required this.message,
required this.msg,
this.data, // data 可以为 null
required this.time,
this.error, // error 可以为 null
});
/// fromJson 工厂构造函数(重构后)
factory BaseModel.fromJson(
Map<String, dynamic> json, {
T? Function(dynamic dataJson)? dataBuilder,
}) {
// 使用一个辅助函数来安全地转换类型,防止因类型不匹配(如 "0" vs 0而崩溃
int _parseInt(dynamic value) {
if (value is int) return value;
if (value is String) return int.tryParse(value) ?? -1;
return -1;
}
T? finalData;
// 检查 'data' 字段是否存在
if (json.containsKey('data') && json['data'] != null) {
if (dataBuilder != null) {
// 如果提供了 dataBuilder就用它来解析成具体的 T 类型对象
finalData = dataBuilder(json['data']);
} else {
// 如果没有提供 dataBuilder但 T 不是 dynamic我们假设 data 就是 T 类型
// 这在使用 BaseModel<Map<String, dynamic>> 时很有用
if (T != dynamic) {
try {
finalData = json['data'] as T?;
} catch (e) {
// 如果直接转换失败,保持为 null避免崩溃
finalData = null;
}
} else {
// 如果 T 是 dynamic直接赋值
finalData = json['data'];
}
}
}
return BaseModel<T>(
code: _parseInt(json['code']),
status: json['status'] as bool? ?? false,
message: json['message'] ?? '暂不可用,请稍后',
msg: json['msg'] ?? '暂不可用,请稍后',
time: _parseInt(json['time']),
data: finalData,
error: json['error'],
);
}
/// toJson 方法 (可选)
Map<String, dynamic> toJson() => {
'code': code,
'status': status,
'message': message,
'msg': msg,
'time': time,
'data': data,
'error': error,
};
}