Flutter搜索功能报错:'(dynamic) => Search'不兼容transform类型
错误定位与解决方案
核心错误原因
报错type '(dynamic) => Search' is not a subtype of type '(String, dynamic) => MapEntry<dynamic, dynamic>' of 'transform'的本质是:
- 你假设接口返回的
body['data']是数组(List),所以用map遍历转换为Search对象列表 - 但实际接口返回的
body['data']是单个对象(Map),Map的map方法要求传入(String, dynamic) => MapEntry类型的转换函数,和你写的(dynamic) => Search类型不匹配,导致类型转换失败 - 同时从你的
Search实体类结构来看,它本身就是包含products和categories的顶层对象,而非列表项,进一步验证了data是单个对象而非列表
修复步骤
1. 修正搜索接口解析逻辑
修改searchProducts函数,将返回类型改为单个Search对象,直接解析body['data']:
static Future<Search> searchProducts(String search) async { var url = '${Constants.API_URL_DOMAIN}action=search&token=${Constants.USER_TOKEN}&q=$search'; final response = await http.get(Uri.parse(url)); final body = jsonDecode(response.body); print(url); // 直接解析单个Search对象,而非遍历列表 return Search.fromJson(body['data']); }
2. 修正Future与FutureBuilder类型
更新对应的Future变量和FutureBuilder的泛型类型:
// 改为单个Search的Future late Future<Search> searchFuture = Func.searchProducts(searchController.text); Widget buildSearch() => FutureBuilder<Search>( future: searchFuture, builder: (context, snapshot) { if (snapshot.hasData) { // 这里可以根据snapshot.data?.products/snapshot.data?.categories做UI渲染 return Column( children: [ Text('搜索结果:产品总数${snapshot.data?.products.total}') ], ); } else if (snapshot.hasError) { print(snapshot.error); return Text('错误:${snapshot.error}'); } else { return const CircularProgressIndicator(); } } );
3. 修复实体类隐藏bug
你的Thumbnails类的toJson方法存在错误,当前代码把字段值写死为数字,应该用类的属性:
Map<String, dynamic> toJson() { final _data = <String, dynamic>{}; _data['150'] = s150; // 原代码是150,改为s150 _data['350'] = s350; // 原代码是350,改为s350 _data['750'] = s750; // 原代码是750,改为s750 return _data; }
内容的提问来源于stack exchange,提问作者st4tic
相关产品推荐
相关产品推荐

