| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- int _parseCode(dynamic value) {
- if (value is int) return value;
- if (value is String) return int.tryParse(value) ?? -1;
- if (value is num) return value.toInt();
- return -1;
- }
- /// 统一 API 响应包装
- /// 后端格式:{ "code": 0, "data": {...}, "message": "ok" }
- class ApiResponse<T> {
- final int code;
- final T? data;
- final String message;
- const ApiResponse({
- required this.code,
- this.data,
- required this.message,
- });
- bool get isSuccess => code == 0;
- factory ApiResponse.fromJson(
- Map<String, dynamic> json,
- T Function(Object? json)? fromJsonT,
- ) {
- return ApiResponse<T>(
- code: _parseCode(json['code']),
- data: json['data'] != null && fromJsonT != null
- ? fromJsonT(json['data'])
- : json['data'] as T?,
- message: json['message'] as String? ?? json['msg'] as String? ?? '',
- );
- }
- }
- /// API 异常
- class ApiException implements Exception {
- final int code;
- final String message;
- const ApiException({required this.code, required this.message});
- @override
- String toString() => 'ApiException($code): $message';
- }
|