Flutter如何实现sqflite数据库即时搜索 搜索结果匹配错误如何解决
问题根因
- 搜索逻辑未实际触发:
TextField的onChanged回调中,_filterList(value)方法被注释,输入内容不会触发列表过滤 - 列表未使用过滤后的数据:
ListView.builder的itemCount绑定的是原始全量数据snapshot.data!.length,itemBuilder也从原始数据中取条目,过滤后的filteredList完全没有被用到 - 数据更新后逻辑异常:删除/修改数据后,
doItJustOnce已经为true,不会重新同步原始数据源list,会导致后续操作数据不一致
修正方案
1. 开启输入触发搜索逻辑
修改TextField代码,取消注释调用过滤方法:
TextField( onChanged: (value) { _filterList(value); // 直接调用过滤方法,方法内部已经做了setState }, controller: _searchInputController, // 建议绑定controller方便后续清空等操作 ),
2. 修改ListView绑定过滤后的数据
调整FutureBuilder中ListView的两个核心参数:
// 替换为过滤后列表的长度 itemCount: filteredList.length, // itemBuilder从filteredList取数据,不再用原始snapshot.data itemBuilder: (BuildContext context, int index) { Poets item = filteredList[index]; // 剩下的Dismissible、卡片渲染等逻辑保持不变 }
3. 修正数据更新后的同步逻辑
删除数据后需要同步更新原始数据源和过滤列表,修改onDismissed逻辑:
onDismissed: (direction) async { // 先删除数据库数据 await DatabaseHelper.instance.remove(item.id); setState(() { // 同步删除原始列表和过滤列表中的对应条目 list.remove(item); filteredList.remove(item); }); },
可选优化
如果需要支持新增/编辑数据后自动刷新,可在跳转编辑页的回调中重置标记,下次FutureBuilder刷新会同步最新的全量数据:
onTap: () { Navigator.of(context).push(MaterialPageRoute( builder: (context) => AddEditClient( true, poet: item, ))).then((_) { // 返回页面后重置标记 doItJustOnce = false; }); },
也可以在filteredList.isEmpty时增加无搜索结果的提示控件,提升使用体验。
内容的提问来源于stack exchange,提问作者Farid Gem
相关产品推荐
相关产品推荐

