Flutter 图片选择和图片上传看这一篇就够了

内容简介

本篇将介绍 Flutter 中如何完成图片上传,以及上传成功后的表单提交。涉及的知识点如下:

  • 图片选择插件wechat_assets_picker的使用。
  • 图片选择 iOS 和安卓的应用权限配置。
  • 图片选择组件的封装。
  • 图片上传接口的封装。
  • 添加和编辑页面中图片上传实现。

图片选择插件

Flutter 的图片选择插件很多,包括了官方的 image_pickermulti_image_picker(基于2.0出了 multi_image_picker2)等等。为了寻找合适的图片选择插件,找了好几个,发现了一个仿微信的图片选择插件 wechat_assets_picker,看评分和 Github的Star都不错,先来试用一下。

权限申请

先上了一个简单的 demo,直接调用:

final List<AssetEntity> assets = await AssetPicker.pickAssets(context);

结果发现闪退了!!!难道是插件有bug?

bug.jpg

哦,想起来了!忘记设置图片获取权限了!iOS

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Flutter 图片上传可以通过以下步骤实现: 1. 导入相关依赖: ```dart dependencies: dio: ^4.0.0 flutter_image_compress: ^0.9.0 image_picker: ^0.8.3+2 ``` 2. 添加权限: 在 `AndroidManifest.xml` 中添加以下权限: ```xml <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.CAMERA"/> ``` 在 `Info.plist` 中添加以下权限: ```xml <key>NSCameraUsageDescription</key> <string>使用相机拍照上传图片</string> <key>NSPhotoLibraryUsageDescription</key> <string>使用相册选取图片上传</string> ``` 3. 实现选择图片功能: ```dart final ImagePicker _picker = ImagePicker(); XFile? _imageFile; Future<void> _getImage(ImageSource source) async { final pickedFile = await _picker.pickImage(source: source); if (pickedFile != null) { setState(() { _imageFile = pickedFile; }); } } ``` 4. 实现图片压缩: ```dart import 'dart:io'; import 'package:flutter_image_compress/flutter_image_compress.dart'; Future<File> _compressImage(File file) async { final result = await FlutterImageCompress.compressAndGetFile( file.absolute.path, file.absolute.path, quality: 50, ); return result!; } ``` 5. 实现上传图片功能: ```dart import 'dart:io'; import 'package:dio/dio.dart'; void _uploadImage() async { if (_imageFile == null) return; final file = File(_imageFile!.path); final compressedFile = await _compressImage(file); final formData = FormData.fromMap({ 'file': await MultipartFile.fromFile(compressedFile.path), }); final response = await Dio().post( 'https://example.com/upload', data: formData, ); if (response.statusCode == 200) { print('上传成功'); } else { print('上传失败'); } } ``` 完整代码示例: ```dart import 'dart:io'; import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flutter_image_compress/flutter_image_compress.dart'; import 'package:image_picker/image_picker.dart'; class ImageUploadPage extends StatefulWidget { const ImageUploadPage({Key? key}) : super(key: key); @override _ImageUploadPageState createState() => _ImageUploadPageState(); } class _ImageUploadPageState extends State<ImageUploadPage> { final ImagePicker _picker = ImagePicker(); XFile? _imageFile; Future<void> _getImage(ImageSource source) async { final pickedFile = await _picker.pickImage(source: source); if (pickedFile != null) { setState(() { _imageFile = pickedFile; }); } } Future<File> _compressImage(File file) async { final result = await FlutterImageCompress.compressAndGetFile( file.absolute.path, file.absolute.path, quality: 50, ); return result!; } void _uploadImage() async { if (_imageFile == null) return; final file = File(_imageFile!.path); final compressedFile = await _compressImage(file); final formData = FormData.fromMap({ 'file': await MultipartFile.fromFile(compressedFile.path), }); final response = await Dio().post( 'https://example.com/upload', data: formData, ); if (response.statusCode == 200) { print('上传成功'); } else { print('上传失败'); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('上传图片'), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ if (_imageFile != null) Image.file(File(_imageFile!.path)) else const Text('请选择图片'), ElevatedButton( onPressed: () => _getImage(ImageSource.camera), child: const Text('拍照'), ), ElevatedButton( onPressed: () => _getImage(ImageSource.gallery), child: const Text('选择图片'), ), ElevatedButton( onPressed: _uploadImage, child: const Text('上传图片'), ), ], ), ), ); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岛上码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值