在 Flutter 中将构造函数作为参数传递

Ale*_*dar 4 constructor parameter-passing flutter

我的 Flutter 应用程序中有 API 通信服务,其中包含 10 多个不同的服务,以及 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这样我就能够以可重用的方式从 API 解析 JSON 对象,无论 Object 类是什么,只需将构造函数传递给此方法即可。

当我在我为获取数据而创建的任何服务中调用此方法时,如下所示:

handleObjectResponse(serverResponse: response, objectConstructor: ChartData.fromJson); 
Run Code Online (Sandbox Code Playgroud)

我收到错误:The getter 'fromJson' isn't defined for the class 'ChartData'. Try importing the library that defines 'fromJson', correcting the name to the name of an existing getter, or defining a getter or field named 'fromJson'.

我认为问题出在这个模型类和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])));
  }
}
Run Code Online (Sandbox Code Playgroud)

Rém*_*let 5

您不能将构造函数作为函数传递。您需要创建一个函数来调用构造函数:

(int a) => Foo(a);
Run Code Online (Sandbox Code Playgroud)

  • 工作完美......但是这是一种多么愚蠢的做事方式......这不能用任何其他方式用不同类型的构造函数来实现?没有关键字工厂? (3认同)