发布时间:2026/7/16 14:21:36
05-Flutter 鸿蒙实战 05:照片上传功能,image_picker + Multipart 进度上传 05. Flutter 鸿蒙实战 05照片上传功能image_picker Multipart 进度上传从图库选择照片校验类型和大小再把字节流上传到后端。上传页职责上传页位于lib/features/upload/upload_page.dart。它不是一个简单的按钮页面而是包含选择照片、预览、MIME 校验、大小限制、上传进度、处理状态、照片管理列表等多个状态。页面状态字段比较多但每个都对应真实交互XFile?_file;Uint8List?_bytes;String?_mimeType;String?_error;String?_success;bool _pickingfalse;bool _uploadingfalse;bool _processingfalse;double _progress0;ListAlbumPhoto_photosconst[];_picking表示正在调起图库_uploading表示字节正在上传_processing表示后端正在识别照片并生成故事。三个状态分开页面才能给出准确提示。选择照片项目使用image_picker并且依赖来自 OpenHarmony 适配仓库。选择图片的代码如下finalfileawait_picker.pickImage(source:ImageSource.gallery,imageQuality:92,);if(filenull)return;finalbytesawaitfile.readAsBytes();finalmimeTypelookupMimeType(file.name,headerBytes:bytes.take(16).toList());这里没有只看文件后缀而是用文件名和头部字节一起判断 MIME。移动端上传图片时用户文件来源不可控后缀并不总是可靠。类型和大小校验项目限制最大 20MB并允许常见图片格式if(bytes.length_maxBytes){throwconstFormatException(照片不能超过 20 MB);}if(!const{image/jpeg,image/png,image/webp,image/heic}.contains(mimeType)){throwconstFormatException(仅支持 JPEG、PNG、WebP 和 HEIC 图片);}这一步放在前端做可以减少无效上传。后端仍然应该做最终校验但前端提前提示会让体验更顺。上传照片上传时调用ApiClient.uploadPhotofinalresponseawaitapiClient.uploadPhoto(bytes:bytes,filename:file.name,mimeType:mimeType,onProgress:(value){if(mounted)setState(()_progressvalue);},);页面上对应显示线性进度条if(_uploading)...[constSizedBox(height:16),LinearProgressIndicator(value:_progress),constSizedBox(height:8),Text(正在上传${(_progress*100).round()}%,textAlign:TextAlign.center,),]这种进度来自真实字节写入不是假 loading。大图上传时用户能看到进度变化。上传列表页面进入后会加载当前用户上传过的照片Futurevoid_loadPhotos()async{finalapiAuthScope.of(context).apiClient;setState((){_photosLoadingtrue;_photosErrornull;});try{finalrowsawaitapi.getJsonList(/api/photos);finalphotosrows.whereTypeMapString,dynamic().map(AlbumPhoto.fromJson).toList();setState((){_photosphotos;_photosLoadingfalse;});}catch(exception){setState((){_photosLoadingfalse;_photosError_message(exception);});}}上传页不只负责“新增”还承担照片管理入口查看原图、打开对话、编辑元数据、开始活化、从上传列表移除、删除照片。OpenHarmony 适配注意点image_picker必须使用带 ohos 实现的版本。依赖写法如下image_picker:git:url:https://gitcode.com/openharmony-tpc/flutter_packages.gitpath:packages/image_picker/image_picker如果换成普通依赖Android 可能正常鸿蒙构建就可能缺少平台实现。Flutter 鸿蒙项目选择插件时第一眼要看有没有ohos适配。扩展拆解上传页的状态拆分上传页不能只用一个loading。这个项目拆成了_picking、_uploading、_processing、_photosLoading、_clearingUploads等多个状态。它们分别对应选择图片、上传文件、后端处理、加载照片列表、清空上传列表。boolget_busy_picking||_uploading||_processing;用户选择图片时上传按钮要禁用文件正在上传时清除按钮也要禁用后端正在处理时不能重复提交同一张照片。把状态拆清楚后页面行为才不会混乱。防重复操作照片列表里的删除、移除、活化使用了不同的 Set 保存忙碌状态finalSetString_removing{};finalSetString_deleting{};finalSetString_animating{};这种写法比全局禁用整个页面更细。某张照片正在删除时只禁用这张照片对应的按钮其他照片仍然可以操作。al Set _removing {};final Set _deleting {};final Set _animating {};这种写法比全局禁用整个页面更细。某张照片正在删除时只禁用这张照片对应的按钮其他照片仍然可以操作。

相关新闻

2026/7/16 15:21:41

GRBL探秘:从G代码行到运动指令的转换之旅

1. GRBL与G代码:数控世界的通用语言 第一次接触GRBL控制器时,我被它简洁高效的特性所吸引。这个仅有30KB大小的开源固件,却能精准控制数控机床完成复杂加工任务。它的核心秘密就在于对G代码的解析能力——就像翻译官将人类语言转换为机器能理…

2026/7/16 15:21:41

Windows安装Git常见报错与正确配置指南

1. 为什么“装完 Git 就报错”是新手最常踩的第一个坑你刚点开 Git 官网,下载完那个几百 MB 的.exe文件,双击安装一路“Next”,最后点完“Finish”——结果打开命令行输入git --version,回车后却只看到一行冰冷的红色报错&#xf…

2026/7/16 15:21:41

ASIC芯片设计:专用集成电路的核心优势与应用实践

1. ASIC芯片的本质与行业定位在半导体行业摸爬滚打十几年,我见过太多客户面对芯片选型时的困惑。当项目需要兼顾性能、功耗和成本时,ASIC(Application-Specific Integrated Circuit)往往是那个被反复权衡的选项。与通用处理器不同…

2026/7/16 15:21:41

全面解锁B站资源:BiliTools高效下载工具使用指南

全面解锁B站资源:BiliTools高效下载工具使用指南 【免费下载链接】BiliTools 本项目已停止维护。 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools BiliTools是一款专业高效的哔哩哔哩资源下载工具箱,为用户提供全面的B站视频、音…

2026/7/16 15:21:41

C++实现LBM算法模拟Couette流动:从原理到代码实践

1. 项目概述:用C和LBM算法模拟Couette流动 最近在整理一些计算流体力学(CFD)的入门项目,发现用格子玻尔兹曼方法(LBM)来模拟Couette流是一个绝佳的起点。Couette流,简单说就是两个平行平板&…

2026/7/16 15:16:41

PaDELPy终极指南:Python计算分子描述符的完整教程

PaDELPy终极指南:Python计算分子描述符的完整教程 【免费下载链接】padelpy A Python wrapper for PaDEL-Descriptor software 项目地址: https://gitcode.com/gh_mirrors/pa/padelpy 在药物发现和化学信息学研究中,分子描述符计算是构建定量构效…

2026/7/15 17:04:06

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾在网易云音乐下载了心爱的歌曲&#…

2026/7/15 22:21:34

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境随着新能源汽车行业的快速发展,充电通信协议的标准化和测试验证变得尤为重要。GB/T 27930-2023作为中国智能充电协议的最新版本,对充电机与电动汽车之间的通信提出了更严格…

2026/7/15 23:18:22

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡 【免费下载链接】rtl8852be Realtek Linux WLAN Driver for RTL8852BE 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8852be 还在为Linux系统无法识别RTL8852BE Wi-Fi 6网卡而烦恼吗?&#x1f…

2026/7/16 0:04:06

AD9215BRUZRL7-105是一款工业 10bit 流水线模数转换器

型号介绍AD9215BRUZRL7-105 是一款10 位单通道高速流水线模数转换器,它采用模拟单电源独立供电 数字驱动分离供电双电源架构,模拟电源 AVDD 额定 3V,允许工作区间 2.7V~3.3V;数字驱动电源 DRV 独立设计,支持 2.25V~3.…

2026/7/16 0:04:06

LTC4418IUF#TRPBF是一款工业级双通道控制器

型号介绍LTC4418IUF#TRPBF 是一款工业级双通道电源路径控制器,它芯片采用 20 引脚 4mm4mm QFN 封装,底部附带外露散热焊盘作为 21 号 GND 引脚,热阻 θJA 为 47℃/W、θJC 仅 4.5℃/W,散热性能适配大功率切换场景;温区…

2026/7/16 0:04:06

uos-exporter核心组件解析:10个关键监控导出器功能详解

uos-exporter核心组件解析:10个关键监控导出器功能详解 【免费下载链接】uos-exporter uos-exporter collects metrics from os 项目地址: https://gitcode.com/openeuler/uos-exporter 前往项目官网免费下载:https://ar.openeuler.org/ar/ uos-…

2026/7/16 13:58:36

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…