#flutter #dart
#трепетание #дротик
Вопрос:
У меня возникли трудности с обработкой запроса json. При попытке обработать его я получаю следующую ошибку:
I/flutter (9296): Исключение: тип ‘_InternalLinkedHashMap<String, dynamic>’ не является подтипом типа ‘List’ в приведении типа
Я был бы признателен, если вы можете помочь это исправить.
основной файл:
import 'package:flutter/material.dart';
import 'package:practice_5/model/breedModel.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'dart:async';
import 'package:flutter/foundation.dart';
Future<List<Dog>> fetchPhotos(http.Client client) async {
final response =
await client.get('https://dog.ceo/api/breeds/image/random');
return compute(parseDog, response.body);
}
List<Dog> parseDog(responseBody) {
final parsed = jsonDecode(responseBody) as List;
return parsed.map<Dog>((json) => Dog.fromJson(json)).toList();
}
class BreedListTile extends StatelessWidget {
@override
Widget build(BuildContext context) {
return FutureBuilder<List<Dog>>(
future: fetchPhotos(http.Client()),
builder: (context, snapshot) {
if (snapshot.hasError) print(snapshot.error);
return snapshot.hasData
? DogListTile (dogs: snapshot.data,)
: Center (child: CircularProgressIndicator());
},
);
}
}
class DogListTile extends StatelessWidget {
final List<Dog> dogs;
DogListTile({Key key, this.dogs}) : super(key: key);
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: dogs.length,
itemBuilder: (context, index) {
return ListTile (
title: Text ('Title'),
subtitle: Text ('Subtitle'),
leading: Image.network(dogs[index].message),
);
});
}
}
Модель класса
class Dog {
Dog({
this.message,
this.status,
});
final String message;
final String status;
factory Dog.fromJson(Map<String, dynamic> json) => Dog(
message: json["message"] == null ? null : json["message"],
status: json["status"] == null ? null : json["status"],
);
Map<String, dynamic> toJson() => {
"message": message == null ? null : message,
"status": status == null ? null : status,
};
}
Комментарии:
1. Первое, что нужно проверить, это то, что
jsonDecode(responseBody)
возвращает aMap
, а не aList
.2. пробовал
final parsed = jsonDecode(responseBody); return parsed <Dog>((json) => Dog.fromJson(json));
получитьI/flutter (10684): Exception: NoSuchMethodError: Class '_InternalLinkedHashMap<String, dynamic>' has no instance method 'call'. I/flutter (10684): Receiver: _LinkedHashMap len:2 I/flutter (10684): Tried calling: call<Dog>(Closure: (dynamic) => Dog)
3. Вы позвонили
parsed<Dog>(...)
.parsed
являетсяMap
объектом, а не типом метода или функции.4. Как мне затем получить правильно завернутый ответ?
5. Ответ — это карта. Неясно, как преобразовать его в список, который вы ожидаете, не видя фактического ответа JSON, с которым вы имеете дело.
Ответ №1:
Вывод из URL-адреса API в фрагменте является:
{
"message": "https://images.dog.ceo/breeds/spaniel-sussex/n02102480_8117.jpg",
"status": "success"
}
который не является списком.
API возвращает только один Dog
объект, а не список Dog
объектов.
Вы можете использовать это для анализа одного Dog
объекта:
final parsed = jsonDecode(responseBody);
Dog dog = Dog.fromJson(parsed))