我的Flutter应用程序中有10多个不同的API通信服务,以及100多个需要解析数据的API调用。为了重用代码,我决定创建一些通用解析代码来解析来自API的数据:
ApiResponse handleObjectResponse({
@required http.Response serverResponse,
@required Function objectConstructor,
}) {
if (serverResponse.statusCode == 200) {
dynamic responseObject = objectConstructor(json.decode(serverResponse.body));
return ApiResponse(responseObject: responseObject);
} else {
ApiError error = responseHasError(serverResponse.body);
return ApiResponse(error: error);
}
}
这样,我就能够以一种可重用的方式从API解析JSON对象,无论Object类是什么,只需将构造函数传递给此方法。
当我在我创建的任何服务中调用这个方法来获取数据时,如下所示:
handleObjectResponse(serverResponse: response, objectConstructor: ChartData.fromJson);
我得到错误:第一个月
我认为问题出在这个model类和factory
语句中,但我不知道如何修复它:
class ChartData {
List<ChartDataPoint> points;
ChartData({
this.points,
});
factory ChartData.fromJson(Map<String, dynamic> json) {
List jsonPoints = json["data"];
return ChartData(
points: List.generate(jsonPoints.length,
(i) => ChartDataPoint.fromJsonArray(jsonPoints[i])));
}
}
2条答案
按热度按时间2hh7jdfx1#
不能将构造函数作为函数传递。您需要创建一个将调用构造函数的函数:
v2g6jxz62#
只是2022年的更新:从2.15开始,
Class.new
就可以实现,请参阅完整的问题:https://github.com/dart-lang/language/issues/216.注意,如果你使用命名参数,两个类构造函数必须有相同的参数名,否则构造函数签名将不匹配,然后它将生成这个静态错误:
元素类型X不能分配给列表类型Y。