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
相关产品推荐
相关产品推荐

