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

gc0ot86w  于 2022-12-19  发布在  Flutter
关注(0)|答案(2)|浏览(251)

我的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])));
  }
}
2hh7jdfx

2hh7jdfx1#

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

(int a) => Foo(a);
v2g6jxz6

v2g6jxz62#

只是2022年的更新:从2.15开始,Class.new就可以实现,请参阅完整的问题:https://github.com/dart-lang/language/issues/216.

class A {
  final String a;

  const A(this.a);

  @override
  String toString() => 'A($a)';
}

class B {
  final String b;

  const B(this.b);

  @override
  String toString() => 'B($b)';
}

void main() {
  final List<Object Function(String)> constructors = [A.new, B.new];

  for (final Object Function(String) constructor in constructors) {
    final Object instance = constructor('My Constructor Parameter');

    if (instance is A) {
      print(instance.toString());
    }
  }
}

注意,如果你使用命名参数,两个类构造函数必须有相同的参数名,否则构造函数签名将不匹配,然后它将生成这个静态错误:
元素类型X不能分配给列表类型Y。

相关问题