Flutter使用file_picker选媒体文件后,扩展名判断耗时优化求助
优化思路与代码实现
针对你当前逐个判断文件扩展名的繁琐写法,推荐用**集合(Set)**来优化查询逻辑,集合的contains方法查询效率为O(1),同时能让代码更简洁易维护。
具体优化步骤
- 提前定义图片和视频扩展名的集合(可作为类成员变量,避免每次调用方法重复创建):
final Set<String> _imageExts = {'bmp', 'gif', 'jpeg', 'jpg', 'png', 'heic'}; final Set<String> _videoExts = {'avi', 'flv', 'mkv', 'mov', 'mp4', 'mpeg', 'webm', 'wmv'};
- 修改文件选择与判断逻辑,复用集合并简化判断:
void pickFiles() async { try { _paths = (await FilePicker.platform.pickFiles( type: FileType.custom, allowMultiple: false, onFileLoading: (FilePickerStatus status) => print(status), allowedExtensions: [..._imageExts, ..._videoExts], // 直接复用集合,避免重复写扩展名 ))?.files; } on PlatformException catch (e) { print('文件选择异常: ${e.toString()}'); } catch (e) { print('未知异常: ${e.toString()}'); } // 空值提前返回,避免后续空指针问题 if (_paths?.single == null) return; final selectedFile = _paths!.single; _fileName = selectedFile.path; final fileExt = selectedFile.extension?.toLowerCase(); // 转小写兼容大小写差异 if (_imageExts.contains(fileExt)) { pathImagePicker.value = _fileName!; } else if (_videoExts.contains(fileExt)) { pathVideoPicker.value = _fileName!; } }
额外优化说明
- 复用集合减少冗余:
allowedExtensions直接拼接两个集合,后续修改扩展名只需维护集合,不用改两处代码。 - 空值提前处理:在获取文件后先判断是否为空,提前返回,避免后续代码反复处理空值。
- 兼容扩展名大小写:添加
toLowerCase(),避免用户选择的文件扩展名是大写(如.JPG)导致判断失效。 - 异常处理优化:将原来无意义的
e.toString()改为打印日志,方便调试排查问题。
内容的提问来源于stack exchange,提问作者HaiAnh
相关产品推荐
相关产品推荐

