我正在为不同的响应集使用json注释创建不同的.g.dart类。现在,当我使用Chopper客户端进行请求并将响应映射到模型类时,我正在创建转换器。但我只能为斩波器客户端分配一个转换器我试图实现的是使用get_it包初始化chopper客户端。如何在提出不同请求时为斩波器客户端分配不同的转换器这是用于初始化类的get_it包的基类。
基本飞镖
import 'package:chopper/chopper.dart' as chopper;
chopper.ChopperClient getBaseChopperClient(GetIt c) {
return chopper.ChopperClient(
baseUrl: 'https://',
interceptors: [chopper.HttpLoggingInterceptor()],
converter: HomeModelConverter(),
errorConverter: chopper.JsonConverter(),
);
}
c.registerLazySingleton(() {
var chopper = getBaseChopperClient(c);
return chopper;
});
c.registerFactory(() => HomeApiService.create(c<chopper.ChopperClient>()));
这个ChopperService类,我从中发出Get请求,并使用HomeModelConverter将响应映射到HomeModelResponse,而这个HomeModelConverters是在上面的chopper客户端对象中分配的。
home_api_service.dart
part 'home_api.chopper.dart';
@ChopperApi(baseUrl: '')
abstract class HomeApiService extends ChopperService {
@Get(path: '')
Future<Response<HomeModelResponse>> getData();
static HomeApiService create([ChopperClient? client]) =>
_$HomeApiService(client);
}
这是一个特定于HomeModelResponse的转换器类。在decodeJson函数中,我们明确提到了它对HomeModelResponse的解码。
home_model_converter.dart
class HomeModelConverter implements Converter {
@override
Request convertRequest(Request request) {
final req = applyHeader(
request,
contentTypeKey,
jsonHeaders,
override: false,
);
return encodeJson(req);
}
Request encodeJson(Request request) {
var contentType = request.headers[contentTypeKey];
if (contentType != null && contentType.contains(jsonHeaders)) {
return request.copyWith(body: json.encode(request.body));
}
return request;
}
Response<BodyType> decodeJson<BodyType, InnerType>(Response response) {
var contentType = response.headers[contentTypeKey];
var body = response.body;
if (contentType != null && contentType.contains(jsonHeaders)) {
body = utf8.decode(response.bodyBytes);
}
try {
var mapData = json.decode(body);
var popular = HomeModelResponse.fromJson(mapData);
return response.copyWith<BodyType>(body: popular as BodyType);
} catch (e) {
chopperLogger.warning(e);
return response.copyWith<BodyType>(body: body);
}
}
@override
Response<BodyType> convertResponse<BodyType, InnerType>(Response response) {
return decodeJson<BodyType, InnerType>(response);
}
}
这是HomeModelResponse,传入响应将自动映射到其中。
home_model_reresponse.dart
part 'home_model_response.g.dart';
@JsonSerializable()
class HomeModelResponse {
------------
-----------
HomeModelResponse({
---------
---------
});
factory HomeModelResponse.fromJson(Map<String, dynamic> json) =>
_$HomeModelResponseFromJson(json);
Map<String, dynamic> toJson() => _$HomeModelResponseToJson(this);
}
上面的代码对home_api_service运行良好,我得到了正确的响应。现在我想创建另一个服务,例如AddApiService。这将有不同的转换器。如何在斩波器客户端动态更改转换器。现在HomeModelConverter是在初始化时进行硬编码分配的。我不想为每个转换器创建多个ChopperClient。卡在这里。或者创建通用转换器的任何选项
如果有人能建议这种方法是否可行,或者在颤振中有更好的方法可以遵循。
我试过了,做了一点变通办法。现在按照我的要求工作。
修改了HomeApiService的初始化如下:
c.registerFactory(() => HomeModelConverter());
c.registerFactory(() => HomeApiService.create(
getBaseChopperClient(c, c<HomeModelConverter>())));
修改了斩波器客户端的初始化,如下所示。这里唯一的缺点是,对于每一个新的斩波器服务,都会创建斩波器客户端的新对象。
chopper.ChopperClient getBaseChopperClient(
GetIt c, chopper.Converter converter) {
return chopper.ChopperClient(
baseUrl: '', // provide your own base url
interceptors: [chopper.HttpLoggingInterceptor()],
converter: converter,
errorConverter: chopper.JsonConverter(),
);
}