Я пытаюсь использовать Dio Client для выполнения вызовов API. При получении ответа выдает ошибку

«_InternalLinkedHashMap» не является подтипом типа «String»

Пытаюсь решить, но не могу. Ниже приведен код


  Future<dynamic> get(
      String uri, {
        Map<String, dynamic> queryParameters,
        Options options,
        CancelToken cancelToken,
        ProgressCallback onReceiveProgress,
      }) async {
    try {
      final Response response = await _dio.get(
        uri,
        queryParameters: queryParameters,
        options: options,
        cancelToken: cancelToken,
        onReceiveProgress: onReceiveProgress,
      );
      return response.data;
    } catch (e) {
      print(e.toString());
      throw e;
    }
  }
} 

Почтовый вызов API

Future<News> getPosts() async {
    try {
      final res = await _dioClient.get(Endpoints.getPosts);
      return News.fromJson(res);
    } catch (e) {
      print(e.toString());
      throw e;
    }
  }

Класс модели использует встроенное_значение

abstract class News implements Built<News, NewsBuilder> {
  News._();

  factory News([updates(NewsBuilder b)]) = _$News;

  @BuiltValueField(wireName: 'status')
  String get status;
  @BuiltValueField(wireName: 'totalResults')
  int get totalResults;
  @BuiltValueField(wireName: 'articles')
  BuiltList<Articles> get articles;
  String toJson() {
    return json.encode(serializers.serializeWith(News.serializer, this));
  }

  static News fromJson(String jsonString) {

    return serializers.deserializeWith(
        News.serializer, json.decode(jsonString));
  }

  static Serializer<News> get serializer => _$newsSerializer;
}

Класс сериализатора

@SerializersFor([
  News,
  Articles,
  Source,
])
final Serializers serializers = (_$serializers.toBuilder()..addPlugin(StandardJsonPlugin())).build();

Помогите как решить

2
Anbu 8 Ноя 2019 в 09:02
Эта ошибка указывает на строку в вашем коде. Не могли бы вы указать, на какую линию он указывает? В противном случае это слишком много догадок.
 – 
Gazihan Alankus
8 Ноя 2019 в 09:38
Как вы предоставляете параметры запроса?
 – 
Salma
8 Ноя 2019 в 11:43
@Сальма. Пожалуйста, найдите детали flutter: *** Request *** flutter: uri: https://newsapi.org/v2/top-headlines?country=in&apiKey=a6f53af8e9ac449dac09131e7aeae549 flutter: method: GET flutter: contentType: application/json; charset=utf-8 flutter: responseType: ResponseType.json flutter: followRedirects: true flutter: connectTimeout: 3000 flutter: receiveTimeout: 5000 flutter: extra: {} flutter: header: Content-Type:application/json; charset=utf-8
 – 
Anbu
8 Ноя 2019 в 12:40
Я отладил код, и ошибка возникает после выполнения строки final res = await _dioClient.get(Endpoints.getPosts); return News.fromJson(res);
 – 
Anbu
11 Ноя 2019 в 07:55

1 ответ

Вам нужно изменить 2 вещи

1) используйте jsonSerializers вместо сериализаторов по умолчанию в файле build_value.

2) используйте response.toString() вместо данных в dio. Вот рабочий пример от меня, просто скопируйте нужные вам части.

Создание модели ценности

abstract class TravelRequest implements Built<TravelRequest, TravelRequestBuilder> {
  TravelRequest._();

  factory TravelRequest([updates(TravelRequestBuilder b)]) = _$TravelRequest;

  @nullable
  @BuiltValueField(wireName: 'id')
  int get id;

  @nullable
  @BuiltValueField(wireName: 'country_from')
  String get countryFrom;

  @nullable
  @BuiltValueField(wireName: 'traveler_name')
  String get travelerName;

  @nullable
  @BuiltValueField(wireName: 'traveler_email')
  String get travelerEmail;

  @nullable
  @BuiltValueField(wireName: 'description')
  String get description;

  String toJson() {
    return json.encode(jsonSerializers.serializeWith(TravelRequest.serializer, this));
  }

  static TravelRequest fromJson(String jsonString) {
    return jsonSerializers.deserializeWith(TravelRequest.serializer, json.decode(jsonString));
  }

  static Serializer<TravelRequest> get serializer => _$travelRequestSerializer;
}

Как использовать с Дио

  Future createTravelRequest(TravelRequest travelRequest) {
return _apiProvider.dio.post(rootPath, data: travelRequest.toJson()).then((response) {
  travelRequests.add(TravelRequest.fromJson(response.toString()));
});
  }
-1
Patrick P. 18 Ноя 2019 в 18:17
Этого ответа немного не хватает: откуда взялось jsonSerializers ? В OP нет ссылок на него, и вы не описали пакет, из которого он исходит, или как его получить в первую очередь.
 – 
HBG
10 Май 2020 в 03:14