无法为 Json 转换创建通用 Dart 构造函数

Having trouble creating generic Dart constructor for Json conversion

致所有 Dart 专家:我正在尝试在 Dart 中实现一个通用网络层,将 REST 服务响应转换为指定模型 class:

// The idea is to make a network call and get a deserialized model as a response:

final token =
        await _authNetworkService.execute<AccessTokenResponse>(request);

实现如下:

// Model interface
abstract class JsonConvertible {
  Map<String, dynamic> toJson();
  JsonConvertible.fromJson(Map<String, dynamic> json);
}

// Model
class AccessTokenResponse extends JsonConvertible {
  String? accessToken;

  @override
  Map<String, dynamic> toJson() {
    return {};
  }

  @override
  AccessTokenResponse.fromJson(Map<String, dynamic> json)
      : super.fromJson(json) {
    accessToken = json['access_token'];
  }
}

// Network response class
class NetworkResponse<Model> {
  Model data;
  
  NetworkResponse.ok(this.data);
}

// Class to create a valid network service request
class NetworkRequest {
}

// Class that performs all network calls
class NetworkService {
  Future<NetworkResponse<M>> execute<M extends JsonConvertible>(NetworkRequest request) async {
    // For simplicity replaced all DIO calls with static data:
    final response = {'data': {'access_token': 'XXX'}};

    return NetworkResponse.ok(M.fromJson(response['data'])); //<- Fails here with error: Method 'fromJson' isn't defined for the type 'Type'...
  }
}

飞镖板:https://dartpad.dev/?id=9a29a7e49a084e69fd1d8078d5f2b977

我怎样才能达到预期的行为?

解决这个问题的一种方法是将 fromJson 构造函数作为参数传递给 execute 函数,但这会增加另一个步骤每次调用 execute

// Class that performs all network calls
class NetworkService {
  Future<NetworkResponse<M>> execute<M extends JsonConvertible>(NetworkRequest request,M Function(Map<String, dynamic>) parser ) async {
    // For simplicity replaced all DIO calls with static data:
    final response = {'data': {'access_token': 'XXX'}};

    return NetworkResponse.ok( parser(response['data']!)); //<- Fails here with error: Method 'fromJson' isn't defined for the type 'Type'...
  }
}

这就是调用 execute 函数的方式

 final token =
        await _authNetworkService.execute<AccessTokenResponse>(request,AccessTokenResponse.fromJson);