Flutter - 原生交互 - 相册

环境

Flutter 3.29

macOS Sequoia 15.4.1

Xcode 16.3

iOS 13.4.1
iOS 18.5

集成image_picker

在Flutter中可以使用image_picker插件实现从相册中获取图片

添加插件

flutter中访问相册image_picker插件

¥ flutter pub add image_picker
¥ flutter pub get

Xcode工程的GeneratePluginRegistrant新增了对应的注册代码

+ (void)registerWithRegistry:(NSObject<FlutterPluginRegistry>*)registry {
...[FLTImagePickerPlugin registerWithRegistrar:[registry       registrarForPlugin:@"FLTImagePickerPlugin"]];
...
}

更新Xcode的pod依赖

¥ pod update
1.png

添加权限

<key>NSPhotoLibraryUsageDescription</key>
<string>需要访问相册以选择图片</string><!-- image_picker也支持直接拍照 -->
<key>NSCameraUsageDescription</key>
<string>需要访问相机用于拍照</string>
<key>NSMicrophoneUsageDescription</key>
<string>需要访问麦克风用于拍摄视频</string>

获取单张照片

可以使用ImagePicker().pickerImage()获取单张图片

else if (index == 2) {_pickImage(ImageSource.gallery),
}
 Future<void> _pickImage(ImageSource source) async {try {// source值可以是相机(camera)或相册(gallery)final pickedFile = await ImagePicker().pickImage(source: source);if (pickedFile != null) {setState(() {if (mounted) {// pop弹窗并返回从相册中选择的图片Navigator.pop(context, pickedFile);}});}} catch (e) {debugPrint("图片选择错误: $e");}}

在上一个界面接收从相册中选择的图片并刷新界面

 floatingActionButton: FloatingActionButton(onPressed: () async {final result = await menuWidget(context: context);if (result != null) {setState(() {_defaultCover = result;});}},backgroundColor: Colors.orangeAccent,child: const Icon(Icons.add, color: Colors.white),
),Future menuWidget({required BuildContext context}) async {return Navigator.push(context,PageRouteBuilder(opaque: false,barrierColor: Colors.black.withValues(alpha: 0.2),pageBuilder:(context, animation, secondaryAnimation) =>PopScope(canPop: true, child: MenuWidget()),transitionsBuilder:(context, animation, secondaryAnimation, child) => SlideTransition(position: Tween<Offset>(begin: const Offset(0.0, 2.4),end: Offset.zero,).animate(animation),child: SlideTransition(position: Tween<Offset>(begin: Offset.zero,end: const Offset(0.0, 2.4),).animate(secondaryAnimation),child: child,),),),);
}

iOS

RPReplay_Final1750762491.mov_optimized.gif

Andorid

42_1750841362.mp4_optimized.gif

获取多张照片

可以使用ImagePicker().pickMultiImage()获取多张图片

_pickMultiImage(),
Future<void> _pickMultiImage() async {try {// 设置最多获取9张图片final pickedFiles = await ImagePicker().pickMultiImage(limit: 9);if (pickedFiles.isNotEmpty) {setState(() {if (mounted) {Navigator.pop(context, pickedFiles);}});}} catch (e) {debugPrint("图片选择错误: $e");}
}
floatingActionButton: FloatingActionButton(onPressed: () async {final result = await menuWidget(context: context);if (result != null) {setState(() {if (result is XFile) {_defaultCover = result;/// 选择多张照片} else if (result is List<XFile>) {_defaultCover = result[0];}});}},backgroundColor: Colors.orangeAccent,child: const Icon(Icons.add, color: Colors.white),),

选择多张照片在iOS平台上只在14+才生效,用的是PhotosUI.framework中的PHPicker,因为手上测试机是13.4.1设备一直无法多选图片,查看源码

- (void)pickMultiImageWithMaxSize:(nonnull FLTMaxSize *)maxSizequality:(nullable NSNumber *)imageQualityfullMetadata:(BOOL)fullMetadatalimit:(nullable NSNumber *)limitcompletion:(nonnull void (^)(NSArray<NSString *> *_Nullable,FlutterError *_Nullable))completion {[self cancelInProgressCall];FLTImagePickerMethodCallContext *context =[[FLTImagePickerMethodCallContext alloc] initWithResult:completion];context.maxSize = maxSize;context.imageQuality = imageQuality;context.requestFullMetadata = fullMetadata;context.maxImageCount = limit.intValue;if (@available(iOS 14, *)) {[self launchPHPickerWithContext:context];} else {// Camera is ignored for gallery mode, so the value here is arbitrary.[self launchUIImagePickerWithSource:[FLTSourceSpecification makeWithType:FLTSourceTypeGallerycamera:FLTSourceCameraRear]context:context];}
}
17504193664484.jpg

limit值传了9,但是launchUIImagePickerWithSource:context:中没有对limit做任何处理代码

- (void)launchUIImagePickerWithSource:(nonnull FLTSourceSpecification *)sourcecontext:(nonnull FLTImagePickerMethodCallContext *)context {UIImagePickerController *imagePickerController = [self createImagePickerController];imagePickerController.modalPresentationStyle = UIModalPresentationCurrentContext;imagePickerController.delegate = self;...
ScreenRecording_06-25-2025.mov_optimized.gif

获取视频

使用ImagePicker().pickMedia()可以从相册获取视频文件

Future<void> _pickVideo() async {try {final pickedVideo = await ImagePicker().pickMedia();if (pickedVideo != null) {setState(() {});}} catch (e) {debugPrint("图片选择错误: $e");}
}
Snip20250625_1.png

获取多媒体文件

使用ImagePicker().pickMultipleMedia()可以从相册获取视频和照片

Future<void> _pickMultiMedia() async {try {final pickedMedia = await ImagePicker().pickMultipleMedia();setState(() {// 页面刷新Navigator.pop(context, pickedMedia);});} catch (e) {debugPrint("图片选择错误: $e");}
}

参考

  1. Image Picker plugin for Flutter

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86141.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

node.js在vscode的配置

文章目录 概要1. 使用和webstrom一样的快捷键2. 让vscode的主题变成webstrom3. 如何在 Node.js 环境下写代码3.1 使用 ESLint配置规则3.2 配置.vscode/settings.json 4. Prettier安装5. 其它问题解决 概要 node.js在webstrom编辑器中可以完美使用代码提示、错误提示等功能&…

Android14音频子系统-Audio HAL分析

文章目录 1&#xff09;概述2&#xff09;HAL的打开流程3&#xff09;HAL库的实现(Qualcomm)4&#xff09;tinyalsa5&#xff09;数据结构6&#xff09;代码流程 1&#xff09;概述 1、回顾HAL、tinyalsa与linux driver的关系 2、与AudioFlinger的关系 3、 1、如何判断当前…

前端与 Spring Boot 后端无感 Token 刷新 - 从原理到全栈实践

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Micro麦可乐的博客 &#x1f425;《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程&#xff0c;入门到实战 &#x1f33a;《RabbitMQ》…

【AI智能体】新手教程-通过 Chat SDK 搭建网页在线客服

通过扣子搭建的智能体可以一键发布为 Chat SDK&#xff0c;快速部署到你的自建网站中&#xff0c;作为在线智能客服面向网站的用户提供 AI 答疑服务。本文档介绍通过 Chat SDK 搭建网页版在线客服的详细操作步骤。 场景说明 网站作为企业和组织与用户互动的重要平台&#xff…

flask静态资源与模板页面、模板用户登录案例

案例代码 import flask# template_folder 模板文件夹(静态页面 html页面渲染) # static_folder 静态资源文件夹主要存放的是类似静态数据、音频、视频、图片等 app flask.Flask(__name__, static_folderstatic, template_foldertemplate)app.route(/) def index():# render_t…

【工具教程】识别PDF中文字内容,批量识别文字并保存到Excel表格中的操作步骤和方法

在日常办公和文件管理中&#xff0c;我们常常会遇到需要处理大量 PDF 文件的情况。有时&#xff0c;为了更好地管理和查找这些文件&#xff0c;需要根据 PDF 文件中特定区域的文字内容对文件进行重命名。例如&#xff0c;在企业档案管理中&#xff0c;合同文件可能需要根据合同…

重生学AI第十三集:初识神经网络之Conv2d

终于该学习神经网络的搭建了&#xff0c;开心&#xff0c;嘻嘻 学习神经网络离不开torch.nn&#xff0c;先把他印在脑子里&#xff0c;什么是torch.nn?他是Pytorch的一个模块&#xff0c;包含了大量构建神经网络需要的类和方法&#xff0c;就像前面学习的torch.utils&#xf…

学习C++、QT---07(C++的权限、C++的引用)

每日一言 你解决的每一个难题&#xff0c;都是在为未来的自己解锁新技能。 权限的讲解 这边呢我们利用银行的一个案例来讲解权限的奥秘 权限指的是public、private 、protected 就是这三种权限&#xff0c;因此有这一张表进行分清他们之间的区别和联系 但是我们在平时的话会因…

全球化短剧平台全栈技术架构白皮书:多区域部署、智能分发与沉浸式体验的完整解决方案

一、全球化基础架构深度设计 全球网络基础设施构建 采用多活数据中心部署模式&#xff0c;在北美&#xff08;弗吉尼亚&#xff09;、欧洲&#xff08;法兰克福&#xff09;、亚太&#xff08;新加坡&#xff09;建立三大核心枢纽节点 构建混合CDN网络&#xff0c;整合AWS Clo…

深入剖析 LGM—— 开启高分辨率 3D 内容创作新时代

一、引言 在当今数字化时代&#xff0c;3D 内容创作的需求如井喷般增长&#xff0c;从游戏开发中绚丽多彩的虚拟世界&#xff0c;到影视制作里震撼人心的特效场景&#xff0c;再到工业设计中精准无误的产品原型&#xff0c;3D 技术无处不在。然而&#xff0c;传统 3D 内容创作…

从用户到社区Committer:小米工程师隋亮亮的Apache Fory成长之路

Apache Fory 是一个基于JIT和零拷贝的高性能多语言序列化框架&#xff0c;实现了高效紧凑的序列化协议&#xff0c;提供极致的性能、压缩率和易用性。在多语言序列化框架技术领域取得了重大突破&#xff0c;推动序列化技术步入高性能易用新篇章&#xff01;这一切&#xff0c;都…

【Koa系列】10min快速入门Koa

简介 koa是基于node开发的一个服务端框架&#xff0c;功能同express&#xff0c;但更小巧简单。 官方仓库地址&#xff1a;https://github.com/koajs/koa 创建项目 创建文件夹nodeKoa&#xff0c;执行以下脚本 npm init -y npm i koa npm i nodemon 基础示例 创建一个服…

IDEA与通义联合:智能编程效率革命

IDEA与通义联合&#xff1a;智能编程效率革命 当最强Java IDE遇上顶尖AI助手&#xff0c;会碰撞出怎样的生产力火花&#xff1f; 思维导图解读&#xff1a;智能编程工作流 #mermaid-svg-uTAcSs1kBBmDwGfM {font-family:"trebuchet ms",verdana,arial,sans-serif;font…

Docker 数据持久化完全指南:Volume、Bind Mount 与匿名卷

Docker 数据持久化完全指南&#xff1a;Volume、Bind Mount 与匿名卷 引言 在 Docker 中&#xff0c;容器的文件系统默认是临时的&#xff0c;容器删除后数据也会丢失。为了实现数据持久化&#xff0c;Docker 提供了多种存储方式&#xff0c;主要包括&#xff1a; docker vo…

OSS跨区域复制灾备方案:华东1到华南1的数据同步与故障切换演练

1. 引言 对象存储服务&#xff08;OSS&#xff09;已成为现代数据架构的核心组件。随着业务全球化&#xff0c;跨区域数据灾备从“可选”变为“必选”。本文以阿里云OSS为实验环境&#xff0c;实战演练华东1&#xff08;杭州&#xff09;到华南1&#xff08;深圳&#xff09;的…

前端登录状态管理:主流方案对比与安全实践指南

根据目前业内前端登录状态管理的主流设计方案&#xff0c;及其演进趋势进行汇总&#xff0c;生成主要包括如下内容的报告&#xff1a; 登录状态保持的基础原理&#xff1a;从HTTP无状态问题出发解析技术需求&#xff0c;使用表格对比核心挑战。主流技术方案对比&#xff1a;详…

动手用 Web 实现一个 2048 游戏

文章目录 为什么选择 2048&#xff1f;关键技术点与算法详解HTML 结构&#xff1a;搭建游戏界面CSS 样式&#xff1a;美化游戏界面JavaScript 核心逻辑&#xff1a;驱动游戏运行1&#xff09;数据结构&#xff1a;二维数组表示游戏网格2&#xff09;核心算法&#xff1a;添加随…

frp v0.62.1内网穿透搭建和使用

官网&#xff1a;https://gofrp.org/zh-cn/ Github&#xff1a;https://github.com/fatedier/frp 开源项目 frp frp 是一种快速反向代理&#xff0c;允许您将位于 NAT 或防火墙后面的本地服务器公开给 Internet。目前支持 TCP 和 UDP&#xff0c;以及 HTTP 和 HTTPS 协议&…

如何使用 USB 数据线将文件从 PC 传输到 iPhone

虽然用 USB 数据线将文件从 PC 传输到安卓设备非常容易&#xff0c;但对于 iPhone 用户来说&#xff0c;情况就不同了。不过&#xff0c;幸运的是&#xff0c;我们找到了三种可靠的方法&#xff0c;可以使用 USB 数据线将文件从 PC 传输到 iPhone&#xff0c;让您轻松完成这项任…

【C++高阶三】AVL树深度剖析

【C高阶三】AVL树深度剖析 1.什么是AVL树2.AVL树的实现2.1节点类和基本结构2.2插入2.3旋转处理2.3.1左单旋2.3.2右单旋2.3.3左右双旋2.3.4右左双旋 1.什么是AVL树 AVL树也叫二叉搜索平衡树 因为二叉搜索树如果插入顺序是有序的&#xff0c;那么这棵树的查找效率将会是O(N)&…