Flutter JSON解析报错:_InternalLinkedHashMap无法转为FutureOr<List<dynamic>>
错误原因分析
你遇到的类型不兼容错误,核心问题是:
你的loadFriendParties函数声明返回Future<List>,但接口返回的data是一个Map对象(对应JSON里data包含intrested/participate/be_today三个数组字段),直接返回这个Map就会触发类型不匹配的报错。
两种解决方案
根据你的业务需求选择合适的处理方式:
方案1:返回完整的data结构(保留三个分类列表)
如果需要保留原有的三个活动分类,直接返回Map类型即可:
// 修改函数返回类型为Map Future<Map<String, dynamic>> loadFriendParties(String id) async { var request = await EndPoints.getUserInterest(id); print(request.body); print(request.statusCode); if (request.statusCode == 200) { // 返回data对应的Map,默认返回空Map兜底 return jsonDecode(request.body)['data'] ?? {}; } return {}; } // 对应调整FutureBuilder的类型 FutureBuilder<Map<String, dynamic>>( // 避免在future里赋值,直接传入函数调用(若需防止重复请求,可将future初始化放到initState) future: loadFriendParties(element['id']), builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.done) { if (snapshot.hasError) { print('加载错误: ${snapshot.error}'); return const Text('加载失败'); } final data = snapshot.data!; // 取出三个分类的活动列表 final interestedList = data['intrested'] as List<dynamic>; final participateList = data['participate'] as List<dynamic>; final beTodayList = data['be_today'] as List<dynamic>; // 这里根据三个列表构建UI示例 return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text('感兴趣的活动'), ...interestedList.map((item) => Text(item['event_name'])).toList(), const SizedBox(height: 16), const Text('已参与的活动'), ...participateList.map((item) => Text(item['event_name'])).toList(), const SizedBox(height: 16), const Text('今日活动'), ...beTodayList.map((item) => Text(item['name'])).toList(), ], ); } else { // 加载中状态 return const CircularProgressIndicator(); } }, )
方案2:合并所有活动为一个列表返回
如果不需要分类,想把三个数组的活动合并成一个列表:
// 保持返回List类型,但合并三个数组 Future<List<dynamic>> loadFriendParties(String id) async { var request = await EndPoints.getUserInterest(id); print(request.body); print(request.statusCode); if (request.statusCode == 200) { final data = jsonDecode(request.body)['data'] as Map<String, dynamic>; List<dynamic> allParties = []; // 依次合并三个列表,空列表兜底避免报错 allParties.addAll(data['intrested'] ?? []); allParties.addAll(data['participate'] ?? []); allParties.addAll(data['be_today'] ?? []); return allParties; } return []; } // FutureBuilder使用原List类型 FutureBuilder<List<dynamic>>( future: loadFriendParties(element['id']), builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.done) { if (snapshot.hasError) { print('加载错误: ${snapshot.error}'); return const Text('加载失败'); } final parties = snapshot.data ?? []; return ListView.builder( itemCount: parties.length, itemBuilder: (context, index) { final party = parties[index]; // 兼容不同字段名:感兴趣的活动用event_name,今日活动用name final title = party['event_name'] ?? party['name']; return ListTile( title: Text(title), subtitle: Text(party['city']), ); }, ); } else { return const CircularProgressIndicator(); } }, )
内容的提问来源于stack exchange,提问作者Karol Wiśniewski
相关产品推荐
相关产品推荐

