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

Flutter清除搜索后无法恢复原始DataTable的问题排查

Flutter DataTable搜索后无法恢复原始列表的原因及解决方法

核心原因

绝大多数情况是没有保留原始数据的独立副本:

  • 你在searchPremises方法中可能直接修改了唯一的数据源列表,导致原始数据被覆盖,清空搜索内容时没有可恢复的完整数据。
  • 或者过滤逻辑是基于上一次过滤后的结果(而非原始数据)进行二次过滤,多次操作后原始数据链断裂。

解决思路

在PremiseCubit中维护两个独立的数据集:

  1. originalPremises:存储初始化时的完整原始数据,初始化后不再修改。
  2. filteredPremises:存储每次过滤后的结果,随搜索文本动态更新。

代码示例

1. 调整PremiseCubit逻辑

class PremiseCubit extends Cubit<PremiseState> {
  // 保存原始完整数据,仅初始化时赋值
  final List<Premise> _originalPremises;
  // 存储过滤后的结果,动态更新
  List<Premise> _filteredPremises;

  PremiseCubit(List<Premise> initialPremises) 
      : _originalPremises = List.from(initialPremises),
        _filteredPremises = List.from(initialPremises),
        super(PremiseLoaded(_filteredPremises));

  void searchPremises(String query) {
    if (query.trim().isEmpty) {
      // 清空搜索时,直接从原始数据复制
      _filteredPremises = List.from(_originalPremises);
    } else {
      // 始终基于原始数据进行过滤,避免数据丢失
      _filteredPremises = _originalPremises.where((premise) {
        // 根据你的数据结构自定义过滤规则,比如匹配名称、编号等
        return premise.name.toLowerCase().contains(query.toLowerCase());
      }).toList();
    }
    emit(PremiseLoaded(_filteredPremises));
  }
}

2. 确保TextField清空时触发正确的搜索

// 假设使用TextEditingController控制输入
final _searchController = TextEditingController();

TextField(
  controller: _searchController,
  onChanged: (value) {
    context.read<PremiseCubit>().searchPremises(value);
  },
  decoration: InputDecoration(
    hintText: "搜索场地",
    suffixIcon: IconButton(
      icon: const Icon(Icons.clear),
      onPressed: () {
        _searchController.clear();
        // 主动触发空字符串搜索,恢复原始列表
        context.read<PremiseCubit>().searchPremises("");
        FocusScope.of(context).unfocus();
      },
    ),
  ),
)

额外注意事项

  • 不要直接修改_originalPremises,确保它始终是完整的初始数据集合。
  • 过滤操作必须基于_originalPremises,而不是_filteredPremises,否则会出现“过滤叠加”导致数据丢失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 14:06:02