Flutter报错:'List<dynamic>'不是'String'子类型的排查与解决
问题分析与解决方案
核心错误原因
JSON重复解析导致类型不匹配
你的workoutsModelFromJson函数设计为接收JSON字符串并内部完成解析,但在API请求代码中,你错误地传入了已经通过jsonDecode(response.body)解析后的List对象,直接触发类型不匹配错误,这就是snapshot.error中"类型List错误"的根源。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
相关产品推荐
相关产品推荐

