Исключение при приведении типа

#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) возвращает a Map , а не a List .

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))