You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 12:45:38