Flutter API数据获取报错:_Map<String,dynamic>与FutureOr<List<dynamic>>类型不匹配
解决Flutter API数据类型不匹配错误:
type '_Map<String, dynamic>' is not a subtype of type 'FutureOr<List<dynamic>>' 错误原因
API返回的完整响应是包含results数组的Map对象,但当前CharactersWebServices类的getAllCharacters方法直接返回了整个响应Map,而方法声明的返回类型是List<dynamic>,导致类型不匹配。此外,Character模型类中origin和location被错误定义为List<dynamic>,但API返回的这两个字段是单个对象(Map类型),后续也会引发类型错误。
修复步骤
1. 修正网络请求类(CharactersWebServices)
修改getAllCharacters方法,返回响应中的results数组而非整个Map:
import 'package:dio/dio.dart'; import 'package:study_bloc/constant/strings.dart'; class CharactersWebServices { late Dio dio; CharactersWebServices() { BaseOptions options = BaseOptions( baseUrl: baseUrl, receiveDataWhenStatusError: true, connectTimeout: const Duration(seconds: 20), receiveTimeout: const Duration(seconds: 20), ); dio = Dio(options); } Future<List<dynamic>> getAllCharacters() async { try { Response response = await dio.get('character'); print(response.data.toString()); // 提取API响应中的results数组返回 return response.data['results']; } catch (e) { print(e.toString()); return []; } } }
2. 修正模型类(Character)
将origin和location的类型改为Map<String, dynamic>,同时将episode类型优化为更具体的List<String>:
class Character { late int id; late String name; late String status; late String species; late String type; late String gender; late Map<String, dynamic> origin; late Map<String, dynamic> location; late String image; late List<String> episode; Character.fromJson(Map<String, dynamic> json) { id = json['id']; name = json['name']; status = json['status']; species = json['species']; type = json['type']; gender = json['gender']; origin = json['origin']; location = json['location']; image = json['image']; episode = List<String>.from(json['episode']); } }
验证说明
修改后,CharactersWebServices返回的是正确的字符列表数组,Character.fromJson能正确解析每个字符对象,包括origin、location和episode字段,彻底解决类型不匹配问题。
内容的提问来源于stack exchange,提问作者Mohammad Jaber
相关产品推荐
相关产品推荐

