摘要

在鸿蒙(OpenHarmony)Flutter 3.27-ohos 生态下,社区已有针对较老 SDK 的 flutter_image_crop 适配。本文记录在 Flutter 3.27.5-ohos-1.0.3 上,将上游 image_crop ^0.4.1 跑通并完成真机验证的过程,涵盖环境、构建、Demo 功能测试与依赖接入。

开源仓库https://gitcode.com/xiaoyangming/flutter_image_crop_ohos


一、为什么要做这件事?

image_crop 是 Flutter 侧常用的图片裁剪插件,主要能力包括:

能力 说明
Crop 组件 提供可交互的裁剪框、缩放与网格 UI
sampleImage 按比例采样缩小大图,降低内存占用
cropImage 按选定区域裁剪并输出文件
getImageOptions 读取图片宽高(不解码全图)

业务里常见场景:用户从相册选图 → 拖动裁剪框 → 导出裁剪结果上传。

鸿蒙 Flutter 使用 ohos 平台实现,不能直接用 pub.dev 上未适配鸿蒙的版本。参考仓基于 3.7-ohos 等版本已有实现,本文目标是在 3.27-ohos 上复用并验证。

在这里插入图片描述


二、环境与参考

2.1 开发环境

版本 / 说明
Flutter 3.27.5-ohos-1.0.3
Dart 3.6.2
命令 flutter(本地若用 FVM,将下文 flutter 改为 fvm flutter 即可)
IDE DevEco Studio(鸿蒙签名、真机调试)

验证 Flutter 版本:

flutter --version

终端  输出截图

2.2 参考与发布仓库

仓库 作用
CPF-Flutter/flutter_image_crop 已有鸿蒙适配,作实现参考
xiaoyangming/flutter_image_crop_ohos 本文适配成果对外发布
pub.dev/image_crop 上游 Dart API(0.4.1)

三、适配思路(3.27-ohos)

整体不是从零写插件,而是:

  1. 以社区 flutter_image_crop 为基线(含 ohos/ ArkTS 原生图像处理)。
  2. 对齐上游包版本 0.4.1,放宽 Dart SDK 约束以支持 Dart 3.x。
  3. 3.27.5-ohos-1.0.3 下执行 pub getanalyzebuild hap
  4. 使用 example 真机验证选图、裁剪 UI 与 cropImage

工程关键目录:

flutter_image_crop_ohos/
├── lib/                 # Dart API(包名仍为 image_crop)
├── ohos/                # 鸿蒙 HAR、ImagecropPlugin 原生实现
├── example/
│   ├── lib/main.dart    # 选图 + Crop 演示
│   └── ohos/            # 示例 App,在此配置签名
└── pubspec.yaml

四、接入项目

4.1 添加依赖

在业务工程 pubspec.yaml 中:

dependencies:
  image_crop:
    git:
      url: https://gitcode.com/xiaoyangming/flutter_image_crop_ohos.git
      ref: v0.4.1-ohos-3.27

说明:Git 仓库名是 flutter_image_crop_ohos,Dart package 名仍是 image_crop,无需改 import。

flutter pub get

4.2 权限说明

example 通过 image_picker 调用系统相册选择器(安全访问相册),用户选图后应用仅获得所选文件 URI,无需声明 ohos.permission.READ_IMAGEVIDEO

4.3 代码示例

import 'dart:io';
import 'package:image_crop/image_crop.dart';

final cropKey = GlobalKey<CropState>();

// 裁剪 UI
Crop.file(imageFile, key: cropKey, aspectRatio: 4.0 / 3.0);

// 读取图片尺寸
final options = await ImageCrop.getImageOptions(file: imageFile);

// 采样缩小
final sampled = await ImageCrop.sampleImage(
  file: imageFile,
  preferredWidth: 1024,
  preferredHeight: 1024,
);

// 执行裁剪
final crop = cropKey.currentState;
if (crop?.area != null) {
  final cropped = await ImageCrop.cropImage(
    file: sampled,
    area: crop!.area!,
    scale: crop.scale,
  );
}

五、构建与签名

5.1 编译 HAP

cd example
flutter pub get
flutter build hap --debug

成功时可看到类似输出:

✓ Built ohos/entry/build/default/outputs/default/entry-default-signed.hap

终端 build hap 成功截图

5.2 DevEco 签名目录

签名请在 example 的鸿蒙工程 配置:

example/ohos/

步骤:File → Project Structure → Signing Configs → Automatically generate signature

DevEco 签名配置界面截图


六、真机功能验证(Demo)

仓库 example 提供选图 + 裁剪演示,建议按下列顺序测试并截图。

步骤 操作 对应 API
1 点击 Open Image 从相册选图 image_picker + sampleImage
2 拖动/缩放裁剪框 Crop 组件
3 点击 Crop Image cropImage
4 查看日志输出裁剪文件路径

在这里插入图片描述

3.27-ohos 已验证项

  • flutter pub get / analyze 无 error
  • flutter build hap --debug 成功
  • 真机 Demo:选图、裁剪 UI、cropImage

七、与参考仓的差异说明

对比项 参考仓(3.7 等) 本文(3.27-ohos)
Flutter SDK 3.7.12-ohos-1.0.6 等 3.27.5-ohos-1.0.3
包版本 0.4.1 对齐 0.4.1
Dart SDK <3.0.0 >=3.0.0 <4.0.0
Example 旧空安全写法 适配 Dart 3 空安全

鸿蒙 API 支持情况(与参考仓一致,节选):

API / 组件 ohos
Crop / Crop.file
cropImage
sampleImage
getImageOptions
requestPermissions

八、常见问题

Q1:build hap 提示配置签名?
在 DevEco 打开 example/ohos,配置自动签名后重试。

Q2:选图无反应?
确认 image_picker 已正确接入;系统选图模式下无需 READ_IMAGEVIDEO。若仍失败,检查 DevEco 签名与真机系统相册是否可用。

Q3:依赖报错找不到 image_crop
确认 git 地址为 flutter_image_crop_ohos,且已 flutter pub get


九、总结

  • Flutter 3.27.5-ohos-1.0.3 上,基于社区 flutter_image_crop 完成 image_crop 0.4.1 适配。
  • 提供可运行的 example Demo 与对外仓库 flutter_image_crop_ohos
  • 核心业务可按本文接入:Crop UI、sampleImagecropImage

十、参考链接


Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐