欢迎加入开源鸿蒙跨平台社区: https://openharmonycrossplatform.csdn.net

一、前言

本文面向鸿蒙 + Flutter 新手开发者,基于Flutter + 三方库 + 鸿蒙技术组合,搭建可直接运行的完整实战项目。通过集成成熟三方库,快速实现鸿蒙端本地相册图片选择、权限申请、图片预览完整业务功能,全程分步教学、代码全注释、环境适配鸿蒙系统,零基础也能一键复现。

二、项目介绍

项目名称:Flutter 鸿蒙相册选择工具

核心技术:Flutter 框架、第三方开源库、鸿蒙 Stage 模型适配

核心三方库

  • image_picker:跨平台图片选择核心三方库,原生兼容鸿蒙

  • permission_handler:鸿蒙权限管理三方库

实现功能

  • 鸿蒙设备动态申请相册权限

  • 调用鸿蒙原生相册

  • 图片选中后实时页面渲染预览

  • 纯 Flutter 代码,兼容鸿蒙设备

三、开发环境前置要求

  • Flutter SDK 3.27.5-ohos 及以上(鸿蒙适配版本)

  • DevEco Studio 已配置鸿蒙开发环境

  • 鸿蒙模拟器 / 鸿蒙真机设备

  • 电脑已配置 Flutter 环境变量

四、第一步:创建 Flutter 鸿蒙项目

打开终端,执行创建项目命令

flutter create flutter_harmony_demo
cd flutter_harmony_demo

执行完成后,项目根目录自动生成 ohos 文件夹,代表项目已支持鸿蒙系统(鸿蒙适配版Flutter会自动创建,无需额外命令)。

五、第二步:引入三方库依赖

打开项目根目录 pubspec.yaml,替换依赖配置:

name: flutter_harmony_demo
description: Flutter结合三方库开发鸿蒙应用实战案例
version: 1.0.0+1

environment:
  sdk: '>=3.16.0 <4.0.0'

dependencies:
  flutter:
    sdk: flutter
  # 图片选择三方库 兼容鸿蒙
  image_picker: ^1.1.0
  # 权限管理三方库 适配鸿蒙权限机制
  permission_handler: ^11.3.0

dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_lints: ^5.0.0

flutter:
  uses-material-design: true

保存文件后,终端执行依赖安装:

flutter pub get

六、第三步:鸿蒙系统权限配置

鸿蒙系统对隐私权限强管控,必须手动配置相册读取权限。

权限配置文件路径

ohos/entry/src/main/module.json5

添加媒体读取权限

{
  "module": {
    "name": "entry",
    "type": "entry",
    "description": "$string:module_desc",
    "mainElement": "EntryAbility",
    "deviceTypes": ["phone","tablet"],
    "requestPermissions": [
      {
        "name": "ohos.permission.READ_MEDIA",
        "reason": "$string:media_permission_desc",
        "usedScene": {
          "abilities": ["EntryAbility"],
          "when": "inuse"
        }
      }
    ]
  }
}

配置权限说明文案

路径:ohos/entry/src/main/resources/zh_CN/element/string.json

{
  "string": [
    {
      "name": "media_permission_desc",
      "value": "用于访问本地相册,选择展示图片"
    }
  ]
}

七、第四步:完整业务代码编写(全注释)

替换 lib/main.dart 全部代码:

// 引入Flutter基础UI组件库
import 'package:flutter/material.dart';
// 引入图片选择三方库
import 'package:image_picker/image_picker.dart';
// 引入权限管理三方库
import 'package:permission_handler/permission_handler.dart';
// 引入文件操作类
import 'dart:io';

void main() {
  // 程序入口,启动根组件
  runApp(const MyHarmonyApp());
}

// 根组件 无状态
class MyHarmonyApp extends StatelessWidget {
  const MyHarmonyApp({super.key});

  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "Flutter三方库鸿蒙开发",
      theme: ThemeData(primaryColor: Colors.teal),
      debugShowCheckedModeBanner: false, // 关闭debug标识
      home: const GallerySelectPage(),
    );
  }
}

// 核心页面 有状态组件(需要动态更新图片)
class GallerySelectPage extends StatefulWidget {
  const GallerySelectPage({super.key});

  
  State<GallerySelectPage> createState() => _GallerySelectPageState();
}

class _GallerySelectPageState extends State<GallerySelectPage> {
  // 存储选中的本地图片文件
  File? _imageFile;
  // 实例化三方库图片选择器对象
  final ImagePicker _picker = ImagePicker();

  /// 申请鸿蒙相册权限
  Future<void> requestMediaPermission() async {
    // 调用三方库申请存储/媒体权限
    PermissionStatus status = await Permission.photos.request();
    // 权限拒绝提示
    if(status.isDenied){
      if(mounted){
        ScaffoldMessenger.of(context).showSnackBar(
          const SnackBar(content: Text("权限已拒绝,无法打开相册"))
        );
      }
    }
  }

  /// 调用三方库 打开鸿蒙相册选择图片
  Future<void> selectImageFromGallery() async {
    // 第一步:先申请权限
    await requestMediaPermission();

    // 第二步:调用image_picker三方库API
    final XFile? result = await _picker.pickImage(
      source: ImageSource.gallery, // 数据源:系统相册
      imageQuality: 90, // 图片压缩质量
    );

    // 第三步:判断是否选择了图片
    if(result != null){
      setState(() {
        // 更新UI,保存图片路径
        _imageFile = File(result.path);
      });
    }
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Flutter+三方库+鸿蒙 实战"),
        centerTitle: true,
      ),
      body: Padding(
        padding: const EdgeInsets.all(20),
        child: Column(
          children: [
            // 图片展示区域
            Expanded(
              child: _imageFile != null
                  ? Image.file(
                      _imageFile!,
                      fit: BoxFit.contain,
                    )
                  : const Center(
                      child: Text(
                        "暂无选中图片\n点击下方按钮选择",
                        style: TextStyle(fontSize: 16,color: Colors.grey),
                      ),
                    ),
            ),
            const SizedBox(height: 30),
            // 触发按钮
            SizedBox(
              width: double.infinity,
              height: 50,
              child: ElevatedButton(
                onPressed: selectImageFromGallery,
                style: ElevatedButton.styleFrom(
                  backgroundColor: Colors.teal,
                  shape: RoundedRectangleBorder(
                    borderRadius: BorderRadius.circular(10)
                  )
                ),
                child: const Text(
                  "打开鸿蒙相册",
                  style: TextStyle(fontSize: 18,color: Colors.white),
                ),
              ),
            )
          ],
        ),
      ),
    );
  }
}

八、第五步:编译运行鸿蒙项目

方式一:使用DevEco Studio(推荐)

  1. 用DevEco Studio打开项目中的 ohos 目录
  2. 选择鸿蒙设备或模拟器
  3. 点击运行按钮

方式二:使用Flutter命令

查看已连接设备

flutter devices

指定鸿蒙设备运行

flutter run -d ohos

运行说明

  • 首次编译自动下载鸿蒙依赖,等待编译完成

  • 自动安装 App 至鸿蒙模拟器 / 真机

  • 点击按钮,授权权限,即可正常使用

九、项目功能测试流程

  1. 启动 App,首页显示空白占位文案;

  2. 点击【打开鸿蒙相册】按钮;

  3. 弹出鸿蒙系统权限申请,选择允许;

  4. 唤起鸿蒙原生相册应用;

  5. 任选一张图片,自动返回当前页面并渲染展示。

十、核心知识点总结

  • Flutter 鸿蒙适配:使用鸿蒙适配版Flutter SDK,创建项目时自动生成ohos工程目录。

  • 三方库集成规范:在pubspec.yaml声明依赖 → flutter pub get 拉取库 → 直接导入使用,无需原生改造。

  • 鸿蒙开发必备要点:鸿蒙严格限制敏感权限,相册、文件、相机等功能,必须在module.json5手动声明权限。

  • 跨端优势:同一套 Flutter 代码 + 通用三方库,无需修改即可同时运行在安卓、鸿蒙、iOS 平台。

十一、常见问题解决方案

  • 三方库调用相册无反应:检查 module.json5 权限是否配置,重启模拟器重试。

  • 编译报错、依赖冲突:执行 flutter clean 清理缓存,重新 flutter pub get。

  • 无法识别鸿蒙设备:检查 DevEco Studio 鸿蒙驱动、调试模式是否开启。

  • 签名不一致错误(install sign info inconsistent):使用 hdc uninstall 包名 卸载旧应用后重新安装。

  • 屏幕锁定无法启动(The screen is locked):解锁设备屏幕后重新运行。在这里插入图片描述

Logo

一站式 AI 云服务平台

更多推荐