Flutter Dart报错:_InternalLinkedHashMap<String,dynamic>非List<dynamic>子类型
解决Flutter中'_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'List'错误
错误原因
- API返回的是单个对象(Map结构),但你错误地将其强制解析为List类型,触发类型不匹配报错。
getAreas方法返回类型定义为Future<List<Areas>>,但实际API返回单个Areas对象,类型定义与实际数据不匹配。
修正步骤
1. 修正getAreas方法的返回类型与解析逻辑
将方法返回类型改为Future<Areas>,移除错误的List解析代码,正确处理API响应:
Future<Areas> getAreas() async { final Map<String, String> headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer $accessToken', }; final response = await http.get( Uri.parse('https://idonor.ae/api/get-areas'), headers: headers, ); if (response.statusCode == 200) { final Map<String, dynamic> responseData = json.decode(response.body); final Areas areas = Areas.fromJson(responseData); print(areas.data.areas); // 打印获取到的地区列表 return areas; } else { throw Exception('Failed to load data'); } }
2. 调整页面数据展示逻辑
使用FutureBuilder异步获取并展示数据,在页面的build方法中添加以下代码:
@override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('地区列表')), body: FutureBuilder<Areas>( future: getAreas(), builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { return const Center(child: CircularProgressIndicator()); } else if (snapshot.hasError) { return Center(child: Text('加载失败:${snapshot.error}')); } else if (snapshot.hasData) { final List<Area> areasList = snapshot.data!.data.areas; return ListView.builder( itemCount: areasList.length, itemBuilder: (context, index) { final Area area = areasList[index]; return ListTile( title: Text(area.name), subtitle: Text('${area.state}, ${area.country}'), ); }, ); } else { return const Center(child: Text('无数据')); } }, ), ); }
3. 修正initState调用顺序
确保super.initState()在调用getAreas()之前执行(规范写法):
@override void initState() { super.initState(); getAreas(); }
关键说明
- 你的Model类
Areas已正确匹配API返回结构(包含success、data、message字段),无需修改Model代码。 - API返回的
data字段下的areas才是真正的地区列表,需通过snapshot.data!.data.areas获取。
内容的提问来源于stack exchange,提问作者AzeTech
相关产品推荐
相关产品推荐

