美文网首页FlutterFlutter相关
Flutter——头像上传功能,实现照片选择及裁剪

Flutter——头像上传功能,实现照片选择及裁剪

作者: 小宇宙_fly | 来源:发表于2020-02-15 21:49 被阅读0次

使用两个开发库,image_picker和image_crop。

前者用来拍照或者从相册选择照片,后者用来裁剪,结果均为File类型,裁剪完成后可以直接上传文件。

先写到这儿,有时间上代码。

更新:

实现的功能是点击头像图片,弹出选择框,选择拍照或者从相册中选取:

选择头像上传方式

拍照或选取一张图片后,裁剪到想要大小。进行保存或者上传。

实现:

首先的首先,在Android的manifest文件中,加入网络、相机、文件读写的权限,并在application中加入一个activity声明。

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<activity
            android:name="com.yalantis.ucrop.UCropActivity"
            android:screenOrientation="portrait"
            android:theme="@style/Theme.AppCompat.Light.NoActionBar"/>

首先在yaml文件中添加依赖:上https://pub.dartlang.org/packages/ flutter第三方插件官网,找最新版即可。添加之后 package get。

在调用的文件导入包,

import 'package:image_picker/image_picker.dart';

点击按钮,进行拍照:

///拍摄照片
Future getImage() async {
  await ImagePicker.pickImage(source: ImageSource.camera)
      .then((image) => cropImage(image));
}

通过相册选取:

///从相册选取
Future chooseImage() async {
  await ImagePicker.pickImage(source: ImageSource.gallery)
      .then((image) => cropImage(image));
}

.then拿到的是拍好的照片,之后进行跳转到剪裁页面CropImageRoute 进行剪裁。

void cropImage(File originalImage) async {
  String result = await Navigator.push(context,
      MaterialPageRoute(builder: (context) => CropImageRoute(originalImage)));
  if (result.isEmpty) {
    print('上传失败');
  } else {
    //result是图片上传后拿到的url
    setState(() {
      iconUrl = result;
      print('上传成功:$iconUrl');
      _upgradeRemoteInfo();//后续数据处理,这里是更新头像信息
    });
  }
}

剪裁页面CropImageRoute 代码:

import 'dart:io';

import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_productapp/home/moudel/upload_result.dart';
import 'package:flutter_productapp/home/util/screen.dart';
import 'package:flutter_productapp/base_ui/themes.dart';
import 'package:image_crop/image_crop.dart';

class CropImageRoute extends StatefulWidget {
  CropImageRoute(this.image);

  File image; //原始图片路径

  @override
  _CropImageRouteState createState() => new _CropImageRouteState();
}

class _CropImageRouteState extends State<CropImageRoute> {
  double baseLeft; //图片左上角的x坐标
  double baseTop; //图片左上角的y坐标
  double imageWidth; //图片宽度,缩放后会变化
  double imageScale = 1; //图片缩放比例
  Image imageView;
  final cropKey = GlobalKey<CropState>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Container(
      height: Screen.height,
      width: Screen.width,
      color: ThemeColors.color333333,
      child: Column(
        children: <Widget>[
          Container(
            height: Screen.height * 0.8,
            child: Crop.file(
              widget.image,
              key: cropKey,
              aspectRatio: 1.0,
              alwaysShowGrid: true,
            ),
          ),
          RaisedButton(
            onPressed: () {
              _crop(widget.image);
            },
            child: Text('ok'),
          ),
        ],
      ),
    ));
  }

  Future<void> _crop(File originalFile) async {
    final crop = cropKey.currentState;
    final area = crop.area;
    if (area == null) {
      //裁剪结果为空
      print('裁剪不成功');
    }
    await ImageCrop.requestPermissions().then((value) {
      if (value) {
        ImageCrop.cropImage(
          file: originalFile,
          area: crop.area,
        ).then((value) {
          upload(value);
        }).catchError(() {
          print('裁剪不成功');
        });
      } else {
        upload(originalFile);
      }
    });
  }

  ///上传头像
  void upload(File file) {
    print(file.path);
    Dio dio = Dio();
    dio
        .post("http://your ip:port/",
            data: FormData.from({'file': file}))
        .then((response) {
      if (!mounted) {
        return;
      }
      //处理上传结果
      UploadIconResult bean = UploadIconResult(response.data);
      print('上传头像结果 $bean');
      if (bean.code == '1') {
        Navigator.pop(context, bean.data.url);//这里的url在上一页调用的result可以拿到
      } else {
        Navigator.pop(context, '');
      }
    });
  }
}

————————————————

原文链接:https://blog.csdn.net/NNadn/article/details/90633053

相关文章

  • Flutter——头像上传功能,实现照片选择及裁剪

    使用两个开发库,image_picker和image_crop。 前者用来拍照或者从相册选择照片,后者用来裁剪,结...

  • Android实现头像上传

    Android实现本地上传图片并设置为圆形头像 Android实现类似换QQ头像功能(图片裁剪) android上...

  • AndroidHeadImageCliper

    GIT地址 功能描述:头像上传在APP中是很常见的功能,但是关于头像上传前的图片裁剪方式,如果使用系统提供的裁剪方...

  • Image

    设置头像 一、头像设置流程流程一般包括头像选择、上传、裁剪、预览四个步骤,UI界面至少给用户裁剪和预览。 1.选择...

  • 头像裁剪上传功能

    头像裁剪上传功能在现在的App中基本都要用到,今天总结了一下,用比较简单实用的方式(调用系统API)来实现需求。这...

  • Retrofit上传头像

    uploadHeadIcon 实现了上传头像的功能

  • App拍照和选择图片的最佳解决方案

    一、一行代码实现拍照或选择照片 分别是拍照、选择照片、拍照裁剪和选择照片裁剪: 二、 具体实现 2.1 定义回调接...

  • 安卓开发01——上传圆角头像到服务器

    安卓上传圆角头像到服务器功能 功能逻辑流程 第一步 选择照片/拍照(选择照片和拍照分别需要文件读取和相机权限)第二...

  • Android 相机或相册选择图片裁剪

    背景这是一个我们经常使用的功能,比如上传头像、身份证,本功能可选择相机或相册图片后,进入裁剪页面,并可返回Bitm...

  • iOS学习:调用相机和相册,选择图片上传

    今天在项目中要实现一个上传头像功能,点击修改头像行弹出拍照或者从相册选择来设置头像。 实现效果如下图: iOS有两...

网友评论

    本文标题:Flutter——头像上传功能,实现照片选择及裁剪

    本文链接:https://www.haomeiwen.com/subject/xpzjuctx.html