Flutter开发:请求API遇List<dynamic>无法转Map<String,dynamic>错误求助
报错本质说明
触发报错
Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'Map<String, dynamic>'的核心原因,是代码在调用模型类的fromJson方法时,错误传入了根级List结构,而非单个元素对应的Map结构。
代码现存问题逐点排查
- 循环逻辑写反:原代码循环条件为
i>obj.length,循环启动时i=0,永远不可能大于数组总长度,导致循环体完全不执行,数据解析流程中断 - 类型层级混淆:目标接口返回的根JSON结构为数组,json.decode解析后的根值为
List<dynamic>类型,仅数组内的每个元素才是符合fromJson入参要求的Map<String, dynamic>类型 - 异常处理缺失:fetchData方法仅覆盖了状态码200的正常分支,未对非200状态码、网络请求失败的场景做异常抛出,导致FutureBuilder无法正确捕获错误状态
- UI绑定缺失:代码中的ListView未设置itemCount参数,也未将解析完成的列表数据和ListTile的文本组件绑定,即使数据拉取成功也无法渲染出实际内容
修复后的完整实现代码
class _MyHomePageState extends State<MyHomePage> { final String apiUrl = "https://jsonplaceholder.typicode.com/users"; Future<List<Post>> fetchData() async { http.Response res = await http.get(Uri.parse(apiUrl)); if (res.statusCode == 200) { // 解析根级为List结构的返回值 List<dynamic> responseList = json.decode(res.body); List<Post> posts = []; // 修正循环判断条件,遍历所有数组元素 for(int i = 0; i < responseList.length; i++){ // 逐个取出Map结构的元素传入fromJson方法 Post post = Post.fromJson(responseList[i]); posts.add(post); } return posts; } else { // 非200状态抛出异常,供FutureBuilder捕获 throw Exception('请求失败,状态码:${res.statusCode}'); } } @override void initState() { super.initState(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Center( child: FutureBuilder<List<Post>>( future: fetchData(), builder: (ctx, snapShot){ // 加载中状态 if(snapShot.connectionState == ConnectionState.waiting){ return const CircularProgressIndicator(); } // 请求错误状态 if(snapShot.hasError){ return Text('加载失败:${snapShot.error}'); } // 请求成功,渲染列表 final posts = snapShot.data ?? []; return ListView.builder( itemCount: posts.length, itemBuilder: (context, index){ final currentPost = posts[index]; return ListTile( leading: const CircleAvatar(), title: Text(currentPost.name), subtitle: Text(currentPost.email), ); } ); }, ), ), ); } }
内容的提问来源于stack exchange,提问作者Mohamed El Fwakhry
相关产品推荐
相关产品推荐

