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

Flutter报错:'List<dynamic>'不是'String'子类型的排查与解决

问题分析与解决方案

核心错误原因

  1. JSON重复解析导致类型不匹配
    你的workoutsModelFromJson函数设计为接收JSON字符串并内部完成解析,但在API请求代码中,你错误地传入了已经通过jsonDecode(response.body)解析后的List对象,直接触发类型不匹配错误,这就是snapshot.error中"类型List错误"的根源。

  2. FutureBuilder语法逻辑错误
    else if (snapshot.hasError)语句后多了一个分号,导致该分支逻辑为空,后续的错误处理代码会被无条件执行——即使当前处于加载状态,也会显示错误文本而非进度指示器,破坏了状态判断的逻辑。

修复代码

1. 修复API请求代码(APIService)

移除重复的jsonDecode调用,直接传入原始响应字符串:

static Future<List<Workouts_Model>> fetchUserWorkout() async {
  final response = await http.get(Uri.parse(...),
    headers: {...},);

  if (response.statusCode == 200) {
    // 直接传递原始JSON字符串,由模型函数内部解析
    return workoutsModelFromJson(response.body);
  } else {
    throw Exception('Failed to load User');
  }
}

2. 修复FutureBuilder逻辑(HomeScreen)

移除else if (snapshot.hasError)后的分号,将错误处理代码纳入分支逻辑:

FutureBuilder<List<Workouts_Model>>(
  future: futureWorkouts,
  builder: (BuildContext context, AsyncSnapshot<List<Workouts_Model>> snapshot) {
    if (snapshot.hasData) {
      return Column(
          children: List.generate(snapshot.data!.length,
              (index) => Text(snapshot.data![index].name)));
    } else if (snapshot.hasError) {
      print(snapshot.error);
      return Text('${snapshot.error}');
    }
    // 加载状态时显示进度指示器
    return const CircularProgressIndicator();
  },
),

验证说明

修复后,API请求会将原始JSON字符串交给模型函数解析,匹配函数参数要求;FutureBuilder能正确区分数据加载完成、加载错误、加载中三种状态,正常展示名称列表或对应提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:05:30