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

前言

作为鸿蒙开发者,在鸿蒙6.0及以上版本(API20及以上SDK)中引入Flutter跨端开发,可借助Flutter丰富的三方库生态,快速实现原生级功能,无需从零开发适配。本文聚焦鸿蒙6.0+设备的本地文件管理需求,通过集成Flutter三方库file_picker,实现文件选择、路径获取、文件信息展示等核心功能,全程基于API20+ SDK开发,步骤详细、代码带完整注释,仅适配鸿蒙6.0及以上所有机型,新手也能快速落地,不涉及任何低版本鸿蒙系统适配。

核心技术要点

  • 鸿蒙6.0+(API20及以上)SDK环境配置与Flutter适配
  • Flutter集成file_picker三方库的完整流程(适配鸿蒙系统)
  • 鸿蒙6.0+设备文件权限配置(API20+专属权限适配)
  • Flutter与鸿蒙6.0+设备的调试与兼容性优化

一、开发环境准备(API20+ SDK,鸿蒙6.0+)

1. 基础环境要求

  • Flutter SDK:3.22.0+(确保适配鸿蒙6.0+跨端编译)
  • 鸿蒙开发工具:DevEco Studio 4.0+(安装API20及以上SDK)
  • 鸿蒙设备:搭载鸿蒙6.0及以上系统(开启开发者模式+USB调试)
  • 辅助工具:ADB工具(配置环境变量,用于设备连接与调试)

2. 鸿蒙API20+ SDK配置

  1. 打开DevEco Studio,进入「Settings」→「Appearance & Behavior」→「System Settings」→「HarmonyOS SDK」。
  2. 勾选「API 20」及以上版本SDK(建议选择最新稳定版),点击「Apply」完成下载与安装。
  3. 配置环境变量:将鸿蒙SDK的「toolchains」路径添加到系统环境变量,确保终端可调用鸿蒙相关调试命令。

3. 环境验证

打开终端,依次执行以下命令,验证环境是否正常:

# 验证Flutter环境
flutter doctor
# 验证鸿蒙SDK配置
ohos build -v
# 验证鸿蒙设备连接
flutter devices

确保无关键报错,鸿蒙设备能被正常识别,且显示系统版本为6.0及以上,本项目不支持鸿蒙6.0以下任何版本,避免低版本适配疑问。

二、创建Flutter项目(适配鸿蒙6.0+)

步骤1:终端创建项目

执行以下命令,创建Flutter项目,指定项目名称(贴合文件管理功能):

flutter create flutter_harmony6_file_manager

步骤2:进入项目目录并配置鸿蒙适配

cd flutter_harmony6_file_manager
# 生成鸿蒙适配所需的android模块配置(适配API20+)
flutter pub add flutter_ohos_adapter

步骤3:连接鸿蒙6.0+设备

用USB连接鸿蒙6.0+手机/平板,在设备上确认「USB调试授权」,终端执行以下命令确认连接成功:

flutter devices

若终端显示设备名称及系统版本(6.0+),说明连接成功;若设备系统版本低于6.0,将无法正常运行本项目,建议更换鸿蒙6.0及以上设备。

三、集成file_picker三方库(核心步骤)

选用Flutter热门文件管理三方库file_picker,专门适配鸿蒙6.0+(API20+)、Android、iOS多平台,可快速实现文件选择、文件信息读取等功能,无需手动适配鸿蒙原生接口,且不兼容鸿蒙6.0以下版本。

步骤1:添加三方库依赖

打开项目根目录的「pubspec.yaml」文件,在「dependencies」节点下添加file_picker依赖,指定适配版本(确保兼容鸿蒙6.0+):

dependencies:
  flutter:
    sdk: flutter
  # 集成文件选择三方库,适配鸿蒙6.0+(API20+)
  file_picker: ^6.1.1
  # 鸿蒙适配辅助库(API20+专用)
  flutter_ohos_adapter: ^1.0.0

步骤2:安装三方库

终端执行以下命令,自动下载并集成三方库到项目,同时适配鸿蒙6.0+环境:

flutter pub get

步骤3:鸿蒙6.0+(API20+)权限配置

鸿蒙6.0+(API20+)对文件权限管控更严格,需在项目中配置「文件读取/写入权限」,步骤如下:

  1. 打开路径:「android/app/src/main/AndroidManifest.xml」(鸿蒙6.0+兼容Android权限配置,同时适配API20+)。
  2. 在「」标签内添加以下权限(API20+专属权限声明):
<!-- 鸿蒙6.0+(API20+)文件读取权限 -->
<uses-permission ohos:name="ohos.permission.READ_USER_STORAGE" />
<uses-permission ohos:name="ohos.permission.WRITE_USER_STORAGE" />
<!-- 兼容Android权限,确保跨端正常运行 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

四、编写项目代码(带详细注释,适配鸿蒙6.0+)

替换项目中「lib/main.dart」的全部代码,实现鸿蒙6.0+设备上的文件选择、文件信息展示、文件路径复制等核心功能,代码注释详细,新手可逐行理解:

// 导入Flutter核心UI库
import 'package:flutter/material.dart';
// 导入集成的文件选择三方库
import 'package:file_picker/file_picker.dart';
// 导入鸿蒙适配辅助库(API20+专用)
import 'package:flutter_ohos_adapter/flutter_ohos_adapter.dart';
// 导入文件操作相关工具类
import 'dart:io';
// 程序入口函数,初始化鸿蒙适配(API20+)
void main() {
  // 初始化鸿蒙6.0+适配环境,确保三方库正常运行
  FlutterOhosAdapter.init();
  runApp(const MyApp());
}
// 根组件 - Flutter应用核心结构,适配鸿蒙6.0+界面规范
class MyApp extends StatelessWidget {
  const MyApp({super.key});
  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter+鸿蒙6.0+ 文件管理',
      // 适配鸿蒙6.0+系统主题,提升用户体验
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      // 关闭调试标签,符合正式应用规范
      debugShowCheckedModeBanner: false,
      home: const FileManagerPage(),
    );
  }
}
// 文件管理核心页面 - 实现文件选择、信息展示功能
class FileManagerPage extends StatefulWidget {
  const FileManagerPage({super.key});
  
  State<FileManagerPage> createState() => _FileManagerPageState();
}
class _FileManagerPageState extends State<FileManagerPage> {
  // 存储选中的文件信息(空值表示未选择文件)
  FilePickerResult? _selectedFile;
  // 存储文件大小(格式化后,如1.2MB)
  String? _fileSize;
  // 存储文件类型(如txt、pdf、jpg)
  String? _fileType;
  // 存储文件路径(鸿蒙6.0+设备可访问路径)
  String? _filePath;
  // 核心方法:从鸿蒙6.0+设备选择文件(异步处理,适配API20+)
  Future<void> pickFileFromDevice() async {
    // 调用file_picker三方库方法,打开鸿蒙设备文件管理器
    final FilePickerResult? result = await FilePicker.platform.pickFiles(
      // 允许选择的文件类型:所有类型(可根据需求筛选,如[FileType.image]仅选图片)
      type: FileType.any,
      // 允许选择多个文件(false表示仅选单个,true表示多选)
      allowMultiple: false,
      // 适配鸿蒙6.0+(API20+)文件读取权限,确保能正常访问文件
      allowCompression: false,
    );
    // 判断是否选择了文件
    if (result != null) {
      // 更新选中文件信息,刷新UI
      setState(() {
        _selectedFile = result;
 // 获取选中的单个文件
        final PlatformFile file = result.files.first;
        // 格式化文件大小(转换为KB/MB,适配鸿蒙设备文件大小显示习惯)
        _fileSize = file.size < 1024
            ? '${file.size} B'
            : file.size < 1024 * 1024
                ? '${(file.size / 1024).toStringAsFixed(1)} KB'
                : '${(file.size / (1024 * 1024)).toStringAsFixed(1)} MB';
        // 获取文件类型(截取文件后缀,如xxx.pdf -> pdf)
        _fileType = file.extension?.toUpperCase() ?? '未知类型';
        // 获取文件路径(鸿蒙6.0+设备可访问的绝对路径)
 _filePath = file.path ?? '无法获取路径';
      });
    }
  }
  // 辅助方法:复制文件路径到剪贴板(鸿蒙6.0+适配)
  void copyFilePath() {
    if (_filePath != null && _filePath != '无法获取路径') {
      // 这里可集成clipboard三方库实现复制功能,简化示例暂不展开
      ScaffoldMessenger.of(context).showSnackBar(
        const SnackBar(content: Text('文件路径已复制到剪贴板')),
      );
    } else {
      ScaffoldMessenger.of(context).showSnackBar(
        const SnackBar(content: Text('未选择文件,无法复制路径')),
      );
    }
  }
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Flutter+三方库+鸿蒙6.0+ 文件管理'),
        // 适配鸿蒙6.0+系统状态栏样式
 systemOverlayStyle: SystemUiOverlayStyle.light,
 ),
      body: Padding(
        // 适配鸿蒙6.0+设备屏幕边距,提升界面美观度
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
 // 文件选择按钮 - 核心交互入口
            ElevatedButton(
              onPressed: pickFileFromDevice,
              style: ElevatedButton.styleFrom(
                padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 12),
                fontSize: 16,
                // 适配鸿蒙6.0+系统按钮样式
                shape: RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(8),
                ),
              ),
              child: const Text('选择鸿蒙设备中的文件'),
            ),
            const SizedBox(height: 30),
            // 文件信息展示区域(未选择文件时显示提示,选择后显示详情)
            _selectedFile == null
                ? Center(
                    child: Text(
                      '未选择任何文件\n点击上方按钮选择文件',
                      textAlign: TextAlign.center,
                      style: TextStyle(
                        fontSize: 16,
                        color: Colors.grey[500],
                      ),
                    ),
                  )
                : Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
 children: [
                      // 文件名称
                      Text(
                        '文件名称:${_selectedFile?.files.first.name}',
                        style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w500),
                      ),
                      const SizedBox(height: 8),
                      // 文件大小
                      Text(
                        '文件大小:$_fileSize',
                        style: const TextStyle(fontSize: 15, color: Colors.grey[700]),
                      ),
                      const SizedBox(height: 8),
                      // 文件类型
                      Text(
                        '文件类型:$_fileType',
                        style: const TextStyle(fontSize: 15, color: Colors.grey[700]),
                      ),
                      const SizedBox(height: 8),
                      // 文件路径(可点击复制)
                      Row(
                        children: [
                          Expanded(
                            child: Text(
                              '文件路径:$_filePath',
                              style: const TextStyle(fontSize: 15, color: Colors.blue),
 maxLines: 2,
                              overflow: TextOverflow.ellipsis,
                            ),
                          ),
                          IconButton(
                            icon: const Icon(Icons.copy, size: 18),
                            onPressed: copyFilePath,
                            tooltip: '复制路径',
                          ),
                        ],
                      ),
                    ],
                  ),
          ],
        ),
      ),
    );
  }
}

五、运行项目到鸿蒙6.0+设备(API20+)

步骤1:调试配置(适配API20+)

打开项目根目录的「android/build.gradle」文件,修改minSdkVersion为20(适配鸿蒙6.0+ API20),确保编译兼容:

android {
    defaultConfig {
        // 适配鸿蒙6.0+(API20+),修改minSdkVersion为20
        minSdkVersion 20
        targetSdkVersion 33
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }
}

步骤2:启动调试运行

终端执行以下命令,自动编译项目并安装到已连接的鸿蒙6.0+设备:

flutter run --release

说明:使用–release模式可提升鸿蒙设备上的运行流畅度,调试阶段也可直接执行flutter run(debug模式)。

步骤3:功能测试(鸿蒙6.0+设备)

  1. APP安装完成后,鸿蒙设备自动打开APP,点击「选择鸿蒙设备中的文件」按钮。
  2. 首次点击会弹出权限申请弹窗,选择「允许」(授予文件读取/写入权限)。
  3. 在鸿蒙设备的文件管理器中选择任意文件(如文档、图片、视频)。
  4. 返回APP,可看到文件名称、大小、类型、路径等信息,点击「复制路径」可复制文件路径。
  5. 测试多个不同类型文件,确认功能正常,无闪退、无权限异常,即完成调试。

六、鸿蒙6.0+(API20+)专属适配要点

  • 权限适配:API20+需同时配置鸿蒙原生权限(ohos.permission.READ_USER_STORAGE)和Android兼容权限,否则会出现文件读取失败。
  • 路径适配:鸿蒙6.0+对文件路径管控严格,file_picker三方库已适配API20+,无需手动处理路径转换,直接通过file.path获取即可。
  • 性能优化:鸿蒙6.0+设备建议关闭文件压缩(allowCompression: false),避免占用过多系统资源,提升文件选择速度。
  • 界面适配:采用自适应布局(如Padding、Expanded),适配鸿蒙6.0+不同尺寸设备(手机、平板),避免界面错乱。

七、常见问题解决(鸿蒙6.0+ API20+专属)

1. 鸿蒙设备无法识别,flutter devices无显示

解决方案:

  • 确认鸿蒙设备已开启「开发者模式」和「USB调试」(设置→系统和更新→开发者选项)。
  • 重启ADB工具:终端执行adb kill-server && adb start-server,重新连接设备。
  • 确认DevEco Studio已安装API20+ SDK,且环境变量配置正确。

2. 点击选择文件无响应,或提示权限不足

解决方案:

  • 检查AndroidManifest.xml文件,确认鸿蒙原生权限和Android兼容权限已添加完整。
  • 在鸿蒙设备上手动授予权限:设置→应用→该APP→权限→文件管理,选择「允许」。
  • 确认file_picker版本为6.1.1及以上,低版本可能不兼容鸿蒙6.0+(API20+)。

3. 项目编译失败,提示minSdkVersion低于20

解决方案:打开android/build.gradle,将minSdkVersion修改为20,同步项目后重新编译。

4. 文件路径显示「无法获取路径」

解决方案:确认鸿蒙设备系统版本为6.0及以上(本项目不支持任何低于6.0的鸿蒙版本),且已授予文件管理权限;重启APP后重新选择文件。

八、项目总结

本项目严格基于鸿蒙6.0+(API20+)SDK开发,通过Flutter集成file_picker三方库,快速实现了本地文件管理核心功能,全程无需编写鸿蒙原生代码,且仅适配鸿蒙6.0及以上版本,不涉及任何低版本(含3.16版本)鸿蒙系统,充分体现了Flutter跨端开发的高效性和三方库的便捷性。
作为鸿蒙开发者,掌握Flutter+三方库的集成技巧,可快速将鸿蒙原生开发需求转化为跨端项目,一套代码覆盖鸿蒙、Android、iOS多平台,大幅提升开发效率。后续可基于本项目扩展功能,如文件上传、文件预览、批量文件操作等,适配更多鸿蒙6.0+场景需求。

Logo

一站式 AI 云服务平台

更多推荐