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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 21:55:24