Flutter/Dart中如何按日期排序SAF获取的媒体文件路径列表?
如何将SAF获取的媒体文件路径按创建时间排序
saf.cache()方法仅返回文件路径字符串,不包含文件的创建时间元数据,因此需要手动获取每个文件的创建时间后再对列表进行排序。以下是具体实现方案:
实现步骤
- 借助
dart:io中的File类获取每个文件的属性(包含创建时间); - 先批量获取所有文件的创建时间,避免排序过程中重复IO操作;
- 基于创建时间对路径列表进行排序。
完整代码示例
import 'dart:io'; import 'package:saf/saf.dart'; Future<List<String>> fetchImages() async { Saf saf = Saf('specific_directory'); List<String>? cacheList = await saf.cache(); if (cacheList == null) return []; // 过滤出jpg格式文件 List<String> imageList = cacheList.where((element) => element.endsWith('.jpg')).toList(); // 批量获取文件属性,同时处理异常 List<MapEntry<String, FileStat>> fileEntries = []; for (final path in imageList) { try { final fileStat = await File(path).stat(); fileEntries.add(MapEntry(path, fileStat)); } catch (e) { // 可根据需求处理无法访问的文件,比如跳过或记录日志 print('获取文件属性失败:$path,错误信息:$e'); } } // 按创建时间升序排序(最早创建的文件在前) fileEntries.sort((a, b) => a.value.created.compareTo(b.value.created)); // 提取排序后的路径列表 return fileEntries.map((entry) => entry.key).toList(); }
注意事项
- 权限问题:确保应用已获取对应的文件访问权限,否则
File.stat()会抛出异常; - 排序方向:如果需要按创建时间降序排列,将排序逻辑改为
b.value.created.compareTo(a.value.created)即可; - 异常处理:部分文件可能因权限或已被删除无法访问,建议添加异常捕获避免流程中断。
内容的提问来源于stack exchange,提问作者shakky
相关产品推荐
相关产品推荐

