类型转换中的异常
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 <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)
你打电话给parsed<Dog>(...)
。 parsed
是 Map
对象,不是方法或函数类型。
我如何获得正确包装的响应?
响应是一张地图。在没有看到您正在处理的实际 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>”类型的子类型