搜索功能无法恢复原始待办数据问题排查求助
待办事项搜索功能异常问题
问题现象
- 在搜索栏输入任意文本可得到筛选后的结果,但其余待办事项会消失
- 清空搜索栏后无法恢复显示全部待办事项
搜索前:显示完整的待办列表
搜索后:仅保留匹配的待办条目,其余条目丢失
问题代码
搜索功能实现代码
List<Todos> todList =[]; searchTodo(String enterdText) { final search = todList.where((txt) { final inputtext = txt.todoText.toLowerCase(); final input = enterdText.toLowerCase(); return inputtext.contains(input); }).toList(); setState(() => {todList = search}); }
搜索栏UI代码
TextField( onChanged: searchTodo, decoration: InputDecoration( hintText: 'Search', prefixIcon: Icon(Icons.search_rounded), // enabledBorder: InputBorder.none, iconColor: Colors.grey.shade400, border: OutlineInputBorder( borderRadius: BorderRadius.circular(20))), ),
修复方案
问题核心是直接覆盖了唯一的待办列表todList,导致原始数据丢失,无法恢复。需维护原始待办数据副本,搜索时基于原始数据筛选,仅更新用于显示的列表。
修改后的代码示例:
// 保存所有待办的原始数据,不会被搜索操作修改 List<Todos> _originalTodoList = []; // 用于界面显示的列表,随搜索结果动态更新 List<Todos> todList = []; // 初始化或更新待办数据时调用,同步原始列表和显示列表 void updateTodoList(List<Todos> newTodos) { _originalTodoList = List.from(newTodos); todList = List.from(newTodos); setState(() {}); } searchTodo(String enteredText) { if (enteredText.trim().isEmpty) { // 搜索框清空时,恢复显示全部待办 setState(() { todList = List.from(_originalTodoList); }); return; } // 基于原始列表执行筛选,避免修改原始数据 final searchResult = _originalTodoList.where((todo) { final todoText = todo.todoText.toLowerCase(); final input = enteredText.toLowerCase(); return todoText.contains(input); }).toList(); setState(() { todList = searchResult; }); }
修改后,搜索框清空时会自动恢复显示全部待办,且原始数据始终保留,不会丢失。
内容的提问来源于stack exchange,提问作者faiz
相关产品推荐
相关产品推荐

