Исключение Retrofit Dart при обработке JSON
Впервые в Dart/Flutter.
Пытаюсь использовать модернизированный дротик, но мой тестовый код заканчивается исключением:
DioError [DioErrorType.DEFAULT]: type 'String' is not a subtype of type 'Map<String, dynamic>'
Мой pubspec.yaml (фрагмент):
dependencies:
json_serializable: ^3.2.2
json_annotation: 3.0.0
retrofit: any
logger: 0.7.0 #for logging purpose
flutter:
sdk: flutter
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^0.1.2
dev_dependencies:
retrofit_generator: any
build_runner: any
flutter_test:
sdk: flutter
...
Мой API и классы:
import 'package:json_annotation/json_annotation.dart';
import 'package:retrofit/retrofit.dart';
import 'package:dio/dio.dart';
part 'regions.g.dart';
@RestApi(baseUrl: "https://soargbsc.com/rasp/")
abstract class RaspClient {
factory RaspClient(Dio dio) = _RaspClient;
@GET("current.json")
Future<Regions> getRegions();
}
List<Regions> to List<Region>, etc
@JsonSerializable()
class Regions {
String initialRegion;
List<Region> regions;
Airspace airspace;
Regions({this.initialRegion, this.regions, this.airspace});
factory Regions.fromJson(Map<String, dynamic> json) => _$RegionsFromJson(json);
Map<String, dynamic> toJson() => _$RegionsToJson(this);
}
@JsonSerializable()
class Region {
List<String> dates;
String name;
List<String> printDates;
List<Soundings> soundings;
Region({this.dates, this.name , this.printDates, this.soundings
});
factory Region.fromJson(Map<String, dynamic> json) => _$RegionFromJson(json);
Map<String, dynamic> toJson() => _$RegionToJson(this);
}
@JsonSerializable()
class Soundings {
String location;
String longitude;
String latitude;
Soundings({this.location, this.longitude, this.latitude});
factory Soundings.fromJson(Map<String, dynamic> json) => _$SoundingsFromJson(json);
Map<String, dynamic> toJson() => _$SoundingsToJson(this);
}
@JsonSerializable()
class Airspace {
String baseUrl;
List<String> files;
Airspace({this.baseUrl, this.files});
factory Airspace.fromJson(Map<String, dynamic> json) => _$AirspaceFromJson(json);
Map<String, dynamic> toJson() => _$AirspaceToJson(this);
}
Я запустил команду flutter packages pub run build_runner watch и подтвердил, что соответствующий код был сгенерирован в region.g.dart.
Когда я запускаю свою тестовую программу ниже, я вижу Json, отображаемый через LogInterceptor, но затем получаю исключение.
void main() {
test("Get current.json", () async {
final dio = Dio();
dio.interceptors.add(LogInterceptor(responseBody: true));
final client = RaspClient(dio);
client.getRegions().then(expectAsync1(
(regions) => print("Regions: ${regions.regions.length}")
))
;
});
}
Исключение выбрасывается в dio.dart
Response<T> assureResponse<T>(response, [RequestOptions requestOptions]) {
if (response is Response<T>) {
response.request = response.request ?? requestOptions;
} else if (response is! Response) {
response = Response<T>(data: response, request: requestOptions);
} else {
T data = response.data; <<<< Exception happens here <<<<<<<
response = Response<T>(
data: data,
headers: response.headers,
request: response.request,
statusCode: response.statusCode,
isRedirect: response.isRedirect,
redirects: response.redirects,
statusMessage: response.statusMessage,
);
}
return response;
}
Есть идеи, что здесь не так? Мне тоже нужно где-то определять конвертер?
1 ответ
В ПОРЯДКЕ. Проблема заключается в том, что последняя версия dart dio(v3.0.3) несовместима с текущей версией модификации dart(V1.0.1).
Поэтому я обновил свой pubspec.yaml(ниже), чтобы указать более раннюю версию dio (точнее, 2.2.2), и моя небольшая тестовая программа теперь работает.
dependencies:
dio: 2.2.2
json_serializable: ^3.2.2
json_annotation: 3.0.0
retrofit: any
logger: 0.7.0 #for logging purpose
...