Commit 8d581dd25cde5752de7ad3698ed85e1455d9e9bd
1 parent
83beb925
feat: 给字段手写 JsonKey 的 fromJson/toJson,避免build_runner (json_serializable)无法为泛型字段 …
…T data 自动生成代码而报错(Could not generate fromJson code for data because of type T)
Showing
2 changed files
with
16 additions
and
43 deletions
lib/common/request/api_response/api_response_entity.dart
| 1 | import 'dart:convert'; | 1 | import 'dart:convert'; |
| 2 | 2 | ||
| 3 | -import 'package:json_annotation/json_annotation.dart'; | ||
| 4 | - | ||
| 5 | -import 'api_response_entity.g.dart'; | ||
| 6 | - | ||
| 7 | -@JsonSerializable(genericArgumentFactories: true) | 3 | +// No json_serializable here; keep a lightweight manual model to mimic old behavior |
| 4 | +import 'package:wow_english/generated/json/base/json_convert_content.dart'; | ||
| 8 | class ApiResponse<T> { | 5 | class ApiResponse<T> { |
| 9 | int? code; | 6 | int? code; |
| 10 | String? msg; | 7 | String? msg; |
| @@ -12,9 +9,21 @@ class ApiResponse<T> { | @@ -12,9 +9,21 @@ class ApiResponse<T> { | ||
| 12 | 9 | ||
| 13 | ApiResponse(); | 10 | ApiResponse(); |
| 14 | 11 | ||
| 15 | - factory ApiResponse.fromJson(Map<String, dynamic> json) => $ApiResponseFromJson<T>(json); | 12 | + factory ApiResponse.fromJson(Map<String, dynamic> json) { |
| 13 | + final resp = ApiResponse<T>(); | ||
| 14 | + resp.code = jsonConvert.convert<int>(json['code']); | ||
| 15 | + resp.msg = jsonConvert.convert<String>(json['msg']); | ||
| 16 | + if (json['data'] != null) { | ||
| 17 | + resp.data = JsonConvert.fromJsonAsT<T>(json['data']); | ||
| 18 | + } | ||
| 19 | + return resp; | ||
| 20 | + } | ||
| 16 | 21 | ||
| 17 | - Map<String, dynamic> toJson() => $ApiResponseToJson(this); | 22 | + Map<String, dynamic> toJson() => <String, dynamic>{ |
| 23 | + 'code': code, | ||
| 24 | + 'msg': msg, | ||
| 25 | + 'data': data, | ||
| 26 | + }; | ||
| 18 | 27 | ||
| 19 | @override | 28 | @override |
| 20 | String toString() { | 29 | String toString() { |
lib/common/request/api_response/api_response_entity.g.dart deleted
| 1 | -import 'package:flutter/foundation.dart'; | ||
| 2 | - | ||
| 3 | -import '../../../generated/json/base/json_convert_content.dart'; | ||
| 4 | -import 'api_response_entity.dart'; | ||
| 5 | - | ||
| 6 | -ApiResponse<T> $ApiResponseFromJson<T>(Map<String, dynamic> json) { | ||
| 7 | - final ApiResponse<T> apiResponseEntity = ApiResponse<T>(); | ||
| 8 | - final int? code = jsonConvert.convert<int>(json['code']); | ||
| 9 | - if (code != null) { | ||
| 10 | - apiResponseEntity.code = code; | ||
| 11 | - } | ||
| 12 | - final String? msg = jsonConvert.convert<String>(json['msg']); | ||
| 13 | - if (msg != null) { | ||
| 14 | - apiResponseEntity.msg = msg; | ||
| 15 | - } | ||
| 16 | - String type = T.toString(); | ||
| 17 | - T? data; | ||
| 18 | - if (kDebugMode) { | ||
| 19 | - print("ApiResponse<T> T-type:$type, data-type:${json['data'].runtimeType}"); | ||
| 20 | - } | ||
| 21 | - if (json['data'] != null) { | ||
| 22 | - data = JsonConvert.fromJsonAsT(json['data']); | ||
| 23 | - } | ||
| 24 | - if (data != null) { | ||
| 25 | - apiResponseEntity.data = data; | ||
| 26 | - } | ||
| 27 | - return apiResponseEntity; | ||
| 28 | -} | ||
| 29 | - | ||
| 30 | -Map<String, dynamic> $ApiResponseToJson(ApiResponse entity) { | ||
| 31 | - final Map<String, dynamic> data = <String, dynamic>{}; | ||
| 32 | - data['code'] = entity.code; | ||
| 33 | - data['msg'] = entity.msg; | ||
| 34 | - data['data'] = entity.data; | ||
| 35 | - return data; | ||
| 36 | -} |