类型转换中的异常

Posted

技术标签:

【中文标题】类型转换中的异常【英文标题】:Exeption in type cast 【发布时间】:2021-02-02 11:39:31 【问题描述】:

我在处理 json 请求时遇到了困难。 在尝试处理它时,我收到以下错误:

I/flutter (9296):异常:类型“_InternalLinkedHashMap”不是类型转换中“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,
  ;

【问题讨论】:

首先要检查的是 jsonDecode(responseBody) 返回的是 Map 而不是 List 试过final parsed = jsonDecode(responseBody); return parsed &lt;Dog&gt;((json) =&gt; Dog.fromJson(json));得到I/flutter (10684): Exception: NoSuchMethodError: Class '_InternalLinkedHashMap&lt;String, dynamic&gt;' has no instance method 'call'. I/flutter (10684): Receiver: _LinkedHashMap len:2 I/flutter (10684): Tried calling: call&lt;Dog&gt;(Closure: (dynamic) =&gt; Dog) 你打电话给parsed&lt;Dog&gt;(...)parsedMap 对象,不是方法或函数类型。 我如何获得正确包装的响应? 响应是一张地图。在没有看到您正在处理的实际 JSON 响应的情况下,不清楚如何将其转换为您期望的列表。 【参考方案1】:

sn-p 中 API url 的输出是:


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

【讨论】:

以上是关于类型转换中的异常的主要内容,如果未能解决你的问题,请参考以下文章

关于继承中的强制类型转换

Flutter 未处理的异常:类型“Null”不是类型转换中“List<dynamic>”类型的子类型

类型转换异常 java.lang.ClassCastException

C#中的强制类型转换与as转换的区别

常见异常与引用数据类型转换

JAVA 将浮点类型的字符串转换成整数类型 (出现转换异常)