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

Flutter:jsonData判定为List<dynamic>失败,数据无法显示求助

问题解决:Flutter无法解析MySQL返回的JSON数据

核心原因

第一个print(response.body)能执行,但jsonData is List<dynamic>判断不成立,说明接口返回的JSON结构不是直接的数组,而是带外层键的对象(Map类型),导致无法进入分支返回有效数据,最终屏幕无内容展示。

排查与解决步骤

  1. 确认返回的JSON结构
    查看第一个print输出的response.body内容,常见的非直接数组格式示例:
{"code":200,"data":[{"ProjectName":"项目A","TransactionDate":"2024-05-01"},{"ProjectName":"项目B","TransactionDate":"2024-05-02"}]}

这种情况下,jsonDecode后的结果是Map<String, dynamic>,而非直接的List,所以原判断逻辑不生效。

  1. 修改Flutter解析逻辑
    根据实际JSON结构调整代码,以带data键的对象为例,修改fetchData方法:
Future<List<dynamic>> fetchData() async {
  final response = await http.get(Uri.parse('http://10.0.2.2/myDashFolder/collections_fetch.php'));
  if (response.statusCode == 200) {
    try {
      final jsonData = jsonDecode(response.body);
      print(response.body);
      // 适配外层为Map的情况
      if (jsonData is Map<String, dynamic>) {
        final dataList = jsonData['data'];
        if (dataList is List<dynamic>) {
          print('有效数据列表: $dataList');
          return dataList;
        }
      }
      // 兼容直接返回数组的情况
      else if (jsonData is List<dynamic>) {
        print(response.body);
        return jsonData;
      }
    } catch (e) {
      print('Failed to decode JSON: $e');
    }
  }
  return [];
}
  1. 添加调试辅助
    在解析后打印数据类型,快速定位问题:
final jsonData = jsonDecode(response.body);
print('jsonData类型: ${jsonData.runtimeType}');
  1. 检查PHP端输出
    确保PHP脚本返回的JSON格式符合预期:
  • 若要直接返回数组,PHP代码示例:
    $result = mysqli_query($conn, "SELECT * FROM Collections");
    $rows = mysqli_fetch_all($result, MYSQLI_ASSOC);
    echo json_encode($rows);
    
  • 若返回带外层包装的对象,需保证键名与Flutter端解析时一致。

内容的提问来源于stack exchange,提问作者Anirban Sen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 02:33:24