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

Flutter ListView.builder如何隐藏不满足过滤条件的列表项且不删除源数据

Flutter不修改原始列表实现ListView动态过滤方案

核心逻辑为全程保留原始人员列表,仅通过过滤生成临时展示列表,完全不会修改原始数据。


基础代码准备

首先定义People实体类和页面基础变量:

class People {
  final String name;
  final int age;
  People({required this.name, required this.age});
}

// 原始人员列表,全程不会做增删改操作
final List<People> _originPeopleList = [
  People(name: "张三", age: 17),
  People(name: "李四", age: 20),
  People(name: "王五", age: 16),
  People(name: "赵六", age: 22),
];
// 过滤开关:true=仅展示年龄<18的人员,false=展示全部
bool _onlyShowMinor = false;

方式1:实时过滤(适合小数据量场景)

在ListView构建阶段实时生成过滤后的展示列表,逻辑简单无额外维护成本:

@override
Widget build(BuildContext context) {
  // 仅生成临时过滤列表,不会修改原始列表数据
  final showList = _originPeopleList.where((people) => _onlyShowMinor ? people.age < 18 : true).toList();
  return Scaffold(
    body: Column(
      children: [
        // 过滤条件切换控件
        SwitchListTile(
          title: const Text("仅展示未满18岁人员"),
          value: _onlyShowMinor,
          onChanged: (val) {
            setState(() => _onlyShowMinor = val);
          },
        ),
        Expanded(
          child: ListView.builder(
            itemCount: showList.length,
            itemBuilder: (context, index) {
              final people = showList[index];
              return ListTile(
                title: Text(people.name),
                subtitle: Text("年龄:${people.age}"),
              );
            },
          ),
        ),
      ],
    ),
  );
}

方式2:独立维护展示列表(适合大数据量/频繁切换过滤条件场景)

单独维护展示用列表,仅在过滤条件变更时更新,避免每次build重复过滤带来的性能损耗:

// 独立维护的展示列表
late List<People> _showPeopleList;

@override
void initState() {
  super.initState();
  // 初始化默认展示全部人员
  _showPeopleList = List.from(_originPeopleList);
}

// 过滤条件变化时更新展示列表
void _updateFilter(bool onlyShowMinor) {
  setState(() {
    _onlyShowMinor = onlyShowMinor;
    _showPeopleList = _originPeopleList.where((p) => _onlyShowMinor ? p.age < 18 : true).toList();
  });
}

后续ListView直接绑定_showPeopleList构建即可。


注意事项

  • 所有过滤操作均基于原始列表做筛选拷贝,不会修改原始列表的任何存储数据
  • 如需叠加多个过滤条件,仅需在where方法的判断逻辑中新增条件即可
  • where方法返回懒加载的Iterable对象,调用toList()才会生成新的列表对象,全程不会触碰原始列表的内存数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:06:05