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
英文地址,請注明出處:http://en.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)&…