Flutter选择相册/相机图片上传Firebase Storage后如何自动显示
问题原因
你在异步获取到Firebase Storage返回的图片下载地址imgUrl之后,没有调用setState触发Flutter的UI重绘逻辑,因此页面不会主动更新展示新上传的图片,只能通过热刷新强制重建页面才能加载到最新的imgUrl。
修复方案
基础修复(上传完成后展示云端图片)
只需要修改uploadPosterImage方法中获取下载地址的逻辑,将赋值操作包裹在setState内即可:
uploadPosterImage() async { var pickedImage = await imagePicker.getImage(source: ImageSource.gallery); if (pickedImage != null) { setState(() { file = File(pickedImage.path); }); var imageName = basename(pickedImage.path); var rand = Random().nextInt(10000000); imageName = "$rand$imageName"; // 生成唯一文件名避免重复 refStorage = FirebaseStorage.instance.ref("items/$imageName"); await refStorage.putFile(file); // 新增setState触发UI更新 setState(() { imgUrl = await refStorage.getDownloadURL(); }); } }
优化方案(选中图片立刻本地预览,无需等上传完成)
如果想要提升用户体验,选中图片后不需要等待上传完成就立刻显示,可以先加载本地图片文件,上传完成后再替换为云端地址,修改逻辑如下:
首先调整变量声明,避免空安全报错:
// 移除late关键字,改为可空类型 File? file; final ImagePicker imagePicker = ImagePicker(); String? imgUrl; Reference? refStorage;
修改布局中的图片渲染逻辑:
Container( margin: EdgeInsets.only(bottom: 10), height: 230, width: 160, decoration: BoxDecoration( border: Border.all(color: Colors.yellow), borderRadius: BorderRadius.circular(20) ), child: InkWell( onTap: () async { await uploadPosterImage(); }, child: imgUrl != null ? Image.network(imgUrl!) : (file != null ? Image.file(file!) : _icon) ) )
注意事项
- 如果需要支持相机拍照上传,只需要将
imagePicker.getImage的source参数改为ImageSource.camera即可,上述逻辑通用 - 建议添加上传状态提示,避免用户在上传过程中重复点击触发多次上传
内容的提问来源于stack exchange,提问作者KTJ
相关产品推荐
相关产品推荐

