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

Flutter搜索栏问题:清除文本无法恢复原始数据

问题分析与解决方案

问题根源

你当前的实现直接修改了展示用的数据源displayProduct,每次搜索都会将其替换为过滤后的子集。当清空搜索文本时,你是基于已经被过滤过的displayProduct去筛选空字符串,原始全量数据已经丢失,因此无法恢复初始状态,再次搜索也没有完整数据可供筛选。

解决方案

需要保留一份原始全量数据的副本,每次搜索都基于这份副本进行过滤,而非修改展示用的数据源。

步骤1:添加全量数据变量

在你的State类中新增一个变量用于存储原始全量数据:

// 替换成你的实际Model类型
List<ProductModel>? allProducts;

步骤2:初始化数据

在获取JSON解析后的全量数据时,同时赋值给allProducts和displayProduct(比如在initState或数据加载完成后):

@override
void initState() {
  super.initState();
  // 假设parsedProductsFromJson是你从JSON解析得到的全量数据
  allProducts = parsedProductsFromJson;
  displayProduct = allProducts; // 初始展示全量数据
}

步骤3:修改搜索过滤函数

修改searchProduct,基于原始全量数据进行过滤,并处理空搜索的情况:

void searchProduct(String query) {
  if (query.isEmpty) {
    // 清空搜索时直接恢复全量数据
    setState(() {
      displayProduct = allProducts;
    });
    return;
  }

  final response = allProducts?.where((element) {
    // 处理title为null的情况,避免空指针异常
    final titleProduct = element.title?.toLowerCase() ?? '';
    final input = query.toLowerCase();
    return titleProduct.contains(input);
  }).toList();

  setState(() {
    displayProduct = response;
  });
}

步骤4:保留原TextField代码

原TextField的实现无需修改,继续使用即可。

效果验证

修改后:

  • 清空搜索文本时,会直接恢复展示全量数据
  • 再次输入搜索内容时,基于原始全量数据重新筛选,正常显示匹配结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:50:22