Flutter搜索栏功能异常:输入关键词无结果求排查
问题排查与修复方案
核心问题点
- 搜索函数变量命名冲突:
_filterSearch里重新声明了同名的局部problemlist,导致循环遍历的是空列表,完全没用到全局数据源。 - 模型匹配逻辑无效:用
item.toString().contains(query)判断,默认toString()不会返回模型的具体字段内容(比如姓名、区域),无法正确匹配关键词。 - 搜索结果未更新UI:筛选完成后,既没把结果传递给流控制器,也没触发UI刷新,导致搜索结果无法展示。
- 定时刷新覆盖搜索结果:
initState里的每秒定时任务会重新拉取全量数据,直接覆盖搜索结果。
修复后的完整代码
class view_problem extends StatefulWidget { @override State<view_problem> createState() => _view_problemState(); } class _view_problemState extends State<view_problem> { List<problemModel> problemlist = []; List<problemModel> filteredList = []; StreamController _streamController = StreamController(); Timer? _refreshTimer; Future getAllProblem() async { problemlist = await problemcontrollers().getProblem(); filteredList = List.from(problemlist); _streamController.sink.add(filteredList); } @override void initState() { getAllProblem(); // 如需定时刷新,建议添加搜索状态判断,避免覆盖搜索结果 // _refreshTimer = Timer.periodic(Duration(seconds: 10), (timer) { // getAllProblem(); // }); super.initState(); } @override void dispose() { _streamController.close(); _refreshTimer?.cancel(); super.dispose(); } void _filterSearch(String query) { if (query.isEmpty) { filteredList = List.from(problemlist); } else { filteredList = problemlist.where((item) { // 匹配具体字段,忽略大小写提升体验 return item.name_surname.toLowerCase().contains(query.toLowerCase()) || item.area.toLowerCase().contains(query.toLowerCase()); }).toList(); } _streamController.sink.add(filteredList); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: const Color.fromARGB(255, 14, 12, 134), title: const Text('information'), ), body: Padding( padding: const EdgeInsets.all(10), child: Column( children: [ const SizedBox(height: 20), TextField( onChanged: (value) => _filterSearch(value), decoration: const InputDecoration( labelText: 'Search', suffixIcon: Icon(Icons.search)), ), const SizedBox(height: 20), Expanded( child: StreamBuilder( stream: _streamController.stream, builder: (context, snapshots) { if (snapshots.hasData) { return ListView.builder( itemCount: filteredList.length, itemBuilder: ((context, index) { problemModel problem = filteredList[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), ), trailing: Text( problem.status, style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 16), ), ), ); })); } return const Center(child: CircularProgressIndicator()); }, ), ) ], ), ), ); } }
关键修复说明
- 新增
filteredList存储筛选结果,避免和原始数据源冲突 - 搜索时匹配模型的具体字段(姓名、区域),并忽略大小写优化体验
- 移除了每秒自动刷新的定时任务(如需保留,建议添加搜索状态判断)
- 筛选完成后通过流控制器发送结果,触发UI更新
- 完善资源释放,在
dispose中关闭流和取消定时任务
内容的提问来源于stack exchange,提问作者Pree
相关产品推荐
相关产品推荐

