Я пытаюсь использовать 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();
Помогите как решить
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()));
});
}
jsonSerializers
? В OP нет ссылок на него, и вы не описали пакет, из которого он исходит, или как его получить в первую очередь.
Похожие вопросы
Новые вопросы
flutter
Используйте этот тег для вопросов о наборе инструментов кроссплатформенного пользовательского интерфейса Flutter. Если ваш вопрос касается конкретной платформы, отметьте ее также (например, [android], [ios] и т. д.). Вы также можете включить тег [dart] для вопросов по кодированию.
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
final res = await _dioClient.get(Endpoints.getPosts); return News.fromJson(res);