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

Flutter搜索异常:ListTile与ProgressIndicator无法正常显示

问题修复:搜索结果ListTile与ProgressIndicator不显示问题

核心问题分析

你的代码存在以下关键问题导致UI无法正常更新:

  • 状态变量(itemlist、filteritems、isSearching)定义在build方法内部,每次组件重建时这些变量都会被重置,导致状态丢失。
  • isSearching = false写在setState外部,无法触发UI刷新;且descriptionlist标记为async但内部无异步操作,属于冗余定义。
  • 每次搜索都会重复向itemlist添加数据,导致列表数据冗余,影响搜索结果准确性。

修复后的完整代码

class _SearchState extends State<Search> {
  // 将状态变量移至build方法外,保留组件状态
  late List<String> itemlist;
  List<String> filteritems = [];
  bool isSearching = false;

  @override
  void initState() {
    super.initState();
    // 初始化时一次性获取并转换数据,避免重复遍历
    final searchprovider = Provider.of<NotesProvider>(context, listen: false).usernotes;
    itemlist = searchprovider.map((note) => note.description).toList();
  }

  void descriptionlist({required String items}) {
    setState(() {
      isSearching = true;
      // 基于原始itemlist直接过滤,避免数据冗余
      filteritems = itemlist
          .where((element) => element.toLowerCase().contains(items.toLowerCase()))
          .toList();
      isSearching = false;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: SizedBox(
          width: 150,
          height: 50,
          child: TextField(
            onChanged: (value) {
              descriptionlist(items: value);
            },
          ),
        ),
      ),
      body: isSearching
          ? const Center(child: CircularProgressIndicator())
          : ListView.builder(
              itemCount: filteritems.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text(
                    filteritems[index],
                    style: const TextStyle(fontSize: 50),
                  ),
                );
              },
            ),
    );
  }
}

关键修改说明

  • 状态变量迁移:把itemlist、filteritems、isSearching移到build方法外,确保组件重建时状态不会丢失。
  • 数据初始化优化:在initState中一次性从Provider获取并转换数据,避免每次搜索重复遍历添加。
  • UI更新逻辑修复:将isSearching = false移入setState内部,确保状态变更能触发UI刷新;同时移除不必要的async标记。
  • 搜索匹配优化:将原字符串也转为小写,避免因大小写不一致导致的匹配失败。
  • UI细节修正:给CircularProgressIndicator添加Center包裹,确保指示器显示在屏幕中央。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 12:45:11