Flutter中根据指定元素从Dart列表复制数据到新列表
筛选CSV数据中指定ID的条目
现有代码与数据
已定义变量及CSV加载代码
List<List<dynamic>> _data = []; String key = "39"; List<List<dynamic>> _tempdata = []; void _loadCSV() async { final _rawData = await rootBundle.loadString("assets/mycsv.csv"); List<List<dynamic>> _listData = const CsvToListConverter().convert(_rawData); setState(() { _data = _listData; }); }
CSV文件(mycsv.csv)内容
id,Name,Num,Batch 15,JERRY,PH123,G9 27,Tom,PH129,G8 39,Oggy,PH124,G9 45,Jack,PH125,G10
实现筛选逻辑
由于_data的第一行是表头,筛选时需要跳过该行,再匹配每行的id列(即每行第一个元素)与指定key。
方案一:加载CSV后直接筛选
修改_loadCSV方法,在数据加载完成后立即执行筛选:
void _loadCSV() async { final _rawData = await rootBundle.loadString("assets/mycsv.csv"); List<List<dynamic>> _listData = const CsvToListConverter().convert(_rawData); setState(() { _data = _listData; // 跳过表头,筛选id与key匹配的行 _tempdata = _data.skip(1).where((row) => row[0].toString() == key).toList(); }); }
方案二:单独编写筛选函数
如果需要在其他时机触发筛选,可以单独提取筛选逻辑:
void filterData() { if (_data.isEmpty) return; setState(() { _tempdata = _data.skip(1).where((row) => row[0].toString() == key).toList(); }); }
之后可以在合适的时机调用该函数,比如组件初始化完成后:
@override void initState() { super.initState(); _loadCSV().then((_) => filterData()); }
补充说明
skip(1)用于跳过CSV的表头行,避免把表头纳入筛选范围- 调用
row[0].toString()是因为CSV解析后id可能为数字类型,需要转为字符串才能与字符串类型的key匹配 - 最终
_tempdata会得到目标数据:[["39", "Oggy", "PH124", "G9"]]
内容的提问来源于stack exchange,提问作者Jerome George
相关产品推荐
相关产品推荐

