我在Android Studio中使用Flutter(dart)开发平台应用的时候,想把一个通用的json封装成任意类型的List工具( _fromJsonList
),下面是我最底层的转换函数和类型定义代码。
// services/api_service.dart
import 'package:dio/dio.dart';
import 'package:myapp/models/Common.dart';
import 'dart:convert';
import 'package:logging/logging.dart';
class ApiService {
static final ApiService instance = ApiService._internal();
……somecode
// parse JsonList to List<T>
List<T> _fromJsonList<T extends BaseData>(dynamic data, T entity) {
if (data != null && data is List) {
return data.map((e) {
if (e is Map<String, dynamic>) {
return entity.fromJson(e);
} else {
return e as T;
}
}).toList() as List<T>;
} else {
return [];
}
}
}
class ApiResult<T> {
……
}
abstract class BaseData {
BaseData fromJson(Map<String, dynamic> json);
}
class CommonOption extends BaseData {
String label;
String value;
CommonOption({required this.label, required this.value});
factory CommonOption.fromJson(Map<String, dynamic> json) {
return CommonOption(
label: json['label'],
value: json['value'],
);
}
@override
BaseData fromJson(Map<String, dynamic> json) {
return CommonOption(
label: json['label'],
value: json['value'],
);
}
}
呼叫功能:
Future<List<CommonOption>> getCategoryList() async {
return await ApiService.instance.getList<CommonOption>(
'/category/getCategoryList', CommonOption(label: "", value: ""));
}
当我as T
在转换函数中使用类型转换时,会弹出黄色警告,并且出现[文档链接]:https://dart.dev/tools/diagnostic-messages?utm_source=dartdev&utm_medium=redir&utm_id=diagcode&utm_content=unnecessary_cast#unnecessary_cast
如下图所示:
但这并不影响代码的运行,代码可以成功转换;但如果我没有使用as T
twice进行类型转换,那么代码运行时就会报错
未处理的异常:类型“List(可能是 List,这取决于您删除哪个为 T)”不是类型转换中类型“List”的子类型
是的,我必须使用as T
两次,少一次就会出错!这是怎么回事?有人能告诉我如何消除这个黄色警告吗?或者如何封装这个工具而不触发警告?
您的代码并没有真正以有效的方式解决 json 反序列化问题。
首先,回答您的具体问题:如果您添加,将返回所有不再需要转换的代码
entity.fromJson(e) as T
路径。map
T
toList()
List<T>
现在,更多关于代码的评论:
fromJson
应该只是工厂,而不是实例方法。你传递的是某个类型的随机实体,T
只是为了使用它fromJson
。你可以传递T Function(Map<String, dynamic>) fromJson
:现在无需拥有
BaseData
和扩展它。只需调用_fromJsonList(jsonList, CommonOption.fromJson)
您的列表即可。