ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

image_picker 在 Linux 上的落地:image_picker_linux 联邦插件实现与使用指南

image_picker 在 Linux 上的落地:image_picker_linux 联邦插件实现与使用指南 image_picker 在 Linux 上的落地image_picker_linux 联邦插件实现与使用指南【免费下载链接】packagesA collection of useful packages maintained by the Flutter team项目地址: https://gitcode.com/GitHub_Trending/pac/packagesimage_picker_linux是 Flutter 官方维护的image_picker在 Linux 桌面平台上的实现包属于典型的 endorsed背书联邦插件应用层无需在pubspec.yaml中显式声明它只要使用image_picker/file_selector就会自动被带入。本文基于仓库内该包的 README.md 与其源码实现讲解它的架构原理、能力边界、cameraDelegate相机委托机制以及实际接入方式帮助你在 Linux 桌面应用中快速、正确地完成图片与视频的选择功能。包定位Linux 平台的 image_picker 实现image_picker_linux的定义位于 pubspec.yamlname: image_picker_linux description: Linux platform implementation of image_picker version: 0.2.2 environment: sdk: ^3.10.0 flutter: 3.38.0 flutter: plugin: implements: image_picker platforms: linux: dartPluginClass: ImagePickerLinux dependencies: file_selector_linux: ^0.9.13 file_selector_platform_interface: ^2.2.0 image_picker_platform_interface: ^2.11.0关键信息有三点它通过implements: image_picker声明自己是image_picker的 Linux 平台实现并在linux平台注册dartPluginClass: ImagePickerLinux它的实现完全基于file_selector_linux文件选择对话框与image_picker_platform_interface平台接口定义自身不包含任何原生 C/C 代码版本要求为 Dart SDK ^3.10.0、Flutter 3.38.0当前仓库 CHANGELOG 中 NEXT 一节标注的升级项。从源码结构看该包只有一个入口文件 lib/image_picker_linux.dart核心类ImagePickerLinux继承自CameraDelegatingImagePickerPlatform并通过静态方法注册为平台默认实例class ImagePickerLinux extends CameraDelegatingImagePickerPlatform { /// The file selector used to prompt the user to select images or videos. visibleForTesting static FileSelectorPlatform fileSelector FileSelectorLinux(); /// Registers this class as the default instance of [ImagePickerPlatform]. static void registerWith() { ImagePickerPlatform.instance ImagePickerLinux(); } // ... }这段代码印证了 README 中“Linux 实现本质上是 file_selector 的封装”这一结论fileSelector字段持有FileSelectorLinux()实例所有相册gallery来源的选择操作都会转发给它。使用方式endorsed 插件的两种接入路径README 的 Usage 部分明确了这是 endorsed背书插件这意味着常规使用无需在pubspec.yaml添加依赖。只要你的应用依赖了image_picker或file_selectorFlutter 工具链会依据联邦插件注册表自动把image_picker_linux带入 Linux 构建无需手工声明也无需写任何平台注册代码。这也是应用层推荐的唯一用法。若你想直接使用该包的 API例如在测试中注入ImagePickerLinux或替换fileSelector则应像普通依赖一样显式加入dependencies: image_picker_linux: ^0.2.2两种方式下应用层代码都保持不变仍然使用image_picker的统一 APIfinal picker ImagePicker(); // 从相册选择一张图片 final XFile? image await picker.pickImage(source: ImageSource.gallery); // 选择一段视频 final XFile? video await picker.pickVideo(source: ImageSource.gallery);能力边界README 明示的限制与源码印证README 用专门一节列出了 Linux 实现的 Limitations这是接入前必须了解的能力边界逐条与源码对应如下。ImageSource.camera 默认不支持ImageSource.camerais not supported unless acameraDelegateis set.在 getImageFromSource 与 getVideo 中ImageSource.camera分支直接调用super即CameraDelegatingImagePickerPlatform的默认实现由平台接口在未设置cameraDelegate时抛出StateError。源码注释明确写道// If source is ImageSource.camera, a StateError will be thrown // unless a [cameraDelegate] is set.原因正如image_picker主 README 所述与 Android/iOS 不同Linux 桌面没有系统提供的拍照 UI因此默认无法调用相机。测试用例 image_picker_linux_test.dart 同时覆盖了两种行为设置FakeCameraDelegate后 camera 来源正常返回文件路径未设置时断言抛出StateError。pickImage()maxWidth / maxHeight / imageQuality 不支持The argumentsmaxWidth,maxHeight, andimageQualityare not currently supported.对应实现位于getImageFromSource/getImage/getMultiImage。源码注释说明这些参数即使被传入也会被静默忽略silently ignored不会报错但也不会有任何缩放或压缩效果// [ImagePickerOptions] options are not currently supported. If any // of its fields are set, they will be silently ignored.也就是说在 Linux 上对图片做尺寸裁剪、质量压缩的期望应放到选完文件之后自行处理例如使用package:image进行后处理。pickVideo()maxDuration 不支持The argumentmaxDurationis not currently supported.对应getVideo实现maxDuration与preferredCameraDevice同样被静默忽略// preferredCameraDevice and maxDuration arguments are not currently // supported. If either of these arguments are supplied, they will be silently // ignored.内部实现如何用 file_selector 完成媒体选择ImagePickerLinux对ImageSource.gallery的处理非常直接——构造一个带 MIME 类型过滤的XTypeGroup然后调用file_selector平台接口弹出系统文件选择对话框选图片getImageFromSourceXTypeGroup(label: Images, mimeTypes: [image/*])调用fileSelector.openFile(...)选视频getVideoXTypeGroup(label: Videos, mimeTypes: [video/*])同样调用openFile(...)多选图片getMultiImage改为调用fileSelector.openFiles(...)多选视频getMultiVideoWithOptionsopenFiles(...)类型过滤为video/*图片/视频混合选择getMediaXTypeGroup(label: Images and videos, mimeTypes: [image/*, video/*])并根据options.allowMultiple决定调用openFiles还是openFile。测试文件 image_picker_linux_test.dart 使用 Mockito 对FileSelectorPlatform打桩逐一验证了pickImage、getImage、getImageFromSource、getMultiImage、pickVideo、getVideo、getMultiVideoWithOptions、getMedia传出的XTypeGroup.mimeTypes是否精确匹配图片为[image/*]、视频为[video/*]、混合为[image/*, video/*]并验证了单/多选时空结果用户取消对话框能被优雅处理不会抛出异常。通过 cameraDelegate 启用相机能力虽然 README 将ImageSource.camera列为限制但它也给出了明确的解除路径设置cameraDelegate。机制定义在平台接口包的 camera_delegate.dart 中ImagePickerCameraDelegate抽象类要求实现takePhoto与takeVideo两个方法每个方法都接收带preferredCameraDevice的ImagePickerCameraDelegateOptions。image_picker主 README 给出了标准接入姿势建议在main()中尽早设置import package:image_picker_platform_interface/image_picker_platform_interface.dart; class MyCameraDelegate extends ImagePickerCameraDelegate { override FutureXFile? takePhoto({ ImagePickerCameraDelegateOptions options const ImagePickerCameraDelegateOptions(), }) async { return _takeAPhoto(options.preferredCameraDevice); } override FutureXFile? takeVideo({ ImagePickerCameraDelegateOptions options const ImagePickerCameraDelegateOptions(), }) async { return _takeAVideo(options.preferredCameraDevice); } } void setUpCameraDelegate() { final ImagePickerPlatform instance ImagePickerPlatform.instance; if (instance is CameraDelegatingImagePickerPlatform) { instance.cameraDelegate MyCameraDelegate(); } }设置之后ImagePickerLinux收到ImageSource.camera的请求会直接委托给你的MyCameraDelegatepickImage(source: ImageSource.camera)等调用即可正常工作。社区也可以基于ImagePickerCameraDelegate构建独立的桌面相机 UI 包供各桌面平台复用。由于 Linux 实现中没有现成的拍照实现这部分 UI 与拍摄逻辑需要由使用方自行提供。在 Linux 上运行示例仓库为这个实现包附带了一个完整的示例应用example/lib/main.dart它直接使用ImagePickerPlatform.instance的底层 APIgetVideo、getMultiVideoWithOptions、getMedia、getImageFromSource、getMultiImageWithOptions覆盖了单选/多选图片、单选/多选视频、混合媒体选择以及通过video_player内嵌播放所选视频等场景。示例的 pubspec.yaml 通过path: ..引用本地插件源码便于在开发本包时直接联调。需要注意该示例是面向插件开发者的平台实现测试应用详见其 README目的是做手动与自动化集成测试实际业务应用应使用面向用户的image_picker包而非直接依赖本实现包。小结image_picker_linux是联邦插件架构在 Linux 桌面的一个简洁范例通过 endorsed 机制零配置接入内部以file_selector系统对话框为唯一选择通道用XTypeGroup的 MIME 过滤实现图片/视频/混合媒体的单选与多选。接入前只需记住三条边界相机需要cameraDelegate、图片尺寸与质量参数被忽略、视频时长参数被忽略。对于绝大多数从本机选一张图/一段视频的桌面需求它已经足够直接可用。【免费下载链接】packagesA collection of useful packages maintained by the Flutter team项目地址: https://gitcode.com/GitHub_Trending/pac/packages创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表