Исключение 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
  ...
Другие вопросы по тегам