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

Flutter搜索栏无结果显示问题求助(ListView可正常加载)

Flutter搜索栏无结果问题修复

问题根源

  1. 模型toString方法无效:你直接用item.toString()判断是否包含搜索词,但默认的toString()返回的是类名+哈希值(比如Instance of 'problemModel'),根本不会包含name_surname或area的内容,所以永远匹配不到结果。
  2. StreamBuilder与setState混用:搜索后只通过setState更新了problemlist,但StreamBuilder依赖的是_streamController的流数据,没有同步更新流,导致UI刷新逻辑混乱。
  3. 列表引用传递风险:originalList = problemlist是引用赋值,虽然当前场景下不会出问题,但后续如果修改problemlist可能意外污染原始数据。

修复方案

方案1:简化逻辑,移除StreamBuilder(推荐)

直接依赖problemlist的状态,用setState更新,逻辑更清晰:

class _view_problemState extends State<view_problem> {
  TextEditingController _searchController = TextEditingController();

  List<problemModel> problemlist = [];
  List<problemModel> originalList = [];

  Future getAllProblem() async {
    problemlist = await problemcontrollers().getProblem();
    // 深拷贝原始列表,避免引用共享
    originalList = List.from(problemlist);
    setState(() {});
  }

  @override
  void initState() {
    getAllProblem();
    super.initState();
  }

  void _filterSearch(String query) {
    if (query.isEmpty) {
      // 搜索词为空时恢复原始列表
      problemlist = List.from(originalList);
    } else {
      List<problemModel> filteredList = [];
      for (var item in originalList) {
        // 检查具体字段是否包含搜索词,忽略大小写提升体验
        if (item.name_surname.toLowerCase().contains(query.toLowerCase()) ||
            item.area.toLowerCase().contains(query.toLowerCase())) {
          filteredList.add(item);
        }
      }
      problemlist = filteredList;
    }
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: const Color.fromARGB(255, 14, 12, 134),
        title: const Text('search'),
      ),
      body: Column(
        children: <Widget>[
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: TextField(
              onChanged: _filterSearch,
              controller: _searchController,
              decoration: InputDecoration(
                labelText: "search",
                prefixIcon: const Icon(Icons.search),
                border: OutlineInputBorder(
                  borderRadius: BorderRadius.circular(25.0),
                ),
              ),
            ),
          ),
          Expanded(
            child: problemlist.isEmpty
                ? const Center(child: CircularProgressIndicator())
                : ListView.builder(
                    itemCount: problemlist.length,
                    itemBuilder: (context, index) {
                      final problem = problemlist[index];
                      return Card(
                        margin: const EdgeInsets.all(10),
                        child: ListTile(
                          title: Text(
                            problem.name_surname,
                            style: const TextStyle(
                              fontWeight: FontWeight.bold,
                              fontSize: 19,
                            ),
                          ),
                          subtitle: Text(
                            problem.area,
                            style: const TextStyle(
                              fontWeight: FontWeight.bold,
                              fontSize: 17,
                            ),
                          ),
                        ),
                      );
                    },
                  ),
          ),
        ],
      ),
    );
  }
}

方案2:保留StreamController,同步更新流

如果坚持用Stream管理状态,搜索后需要更新流数据:

void _filterSearch(String query) {
  List<problemModel> filteredList = [];
  if (query.isEmpty) {
    filteredList = List.from(originalList);
  } else {
    for (var item in originalList) {
      if (item.name_surname.toLowerCase().contains(query.toLowerCase()) ||
          item.area.toLowerCase().contains(query.toLowerCase())) {
        filteredList.add(item);
      }
    }
  }
  setState(() {
    problemlist = filteredList;
  });
  // 更新流数据,触发StreamBuilder刷新
  _streamController.sink.add(filteredList);
}

关键优化点

  • 直接判断模型的具体字段(name_surname、area),并忽略大小写,提升用户体验。
  • 搜索词为空时恢复原始列表,避免空列表状态。
  • 用List.from()实现列表深拷贝,避免引用传递导致的原始数据污染。
  • 移除冗余的StreamBuilder(或同步更新流),让状态更新逻辑更一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 06:57:03