HarmonyOS 鸿蒙Next版flutter3.27.5-ohos-1.0.0, file_picker插件启动后报错

HarmonyOS 鸿蒙Next版flutter3.27.5-ohos-1.0.0, file_picker插件启动后报错 【问题描述】:鸿蒙版flutter3.27.5-ohos-1.0.0, file_picker插件启动后报错
【问题现象】: 日志信息 详见附件文件
【版本信息】:DevStudio 6.0.0、手机系统版本模拟器6.0.0、flutter3.27.5-ohos-1.0.0

【尝试解决方案】:尝试替换为file_selector插件可以使用,但是与我的ios,android代码就分叉了

9 回复

楼主请提供下,pubspec.yaml文件如何依赖的file_picker?

更多关于HarmonyOS 鸿蒙Next版flutter3.27.5-ohos-1.0.0, file_picker插件启动后报错的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


加一下这个分支试试: ref: br_v8.0.7_ohos,

更新了 没win32这个报错了,但是UnmodifiableUint8ListView这个报错还在。,

name: beecount
description: "A new Flutter project."
publish_to: 'none'
version: 0.0.1

environment:
  sdk: ^3.6.1
dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter
  flutter_riverpod: ^2.5.1
  drift: ^2.20.2
  drift_sqflite: ^2.0.0
  sqflite: ^2.3.0
  # sqlite3_flutter_libs: ^0.5.24  # 不再需要
  path_provider: ^2.1.4
  path: ^1.9.0
  intl: ^0.19.0
  fl_chart: ^0.68.0
  shared_preferences: ^2.3.2
  csv: ^5.0.2
  file_selector: ^1.0.3
  supabase_flutter: ^2.5.6
  crypto: ^3.0.5
  flutter_svg: ^2.0.10+1
  package_info_plus: ^8.0.2
  url_launcher: ^6.3.0
  http: ^1.2.2
  share_plus: ^10.0.0
  permission_handler: ^11.3.1
  dio: ^5.4.3+1
  open_filex: ^4.4.0
  flutter_local_notifications: ^17.2.2
  timezone: ^0.9.4
  flutter_list_view: ^1.1.29
  visibility_detector: ^0.4.0+2
  reorderable_grid_view: ^2.2.8
  excel: ^4.0.6

dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_lints: ^5.0.0
  build_runner: ^2.4.10
  drift_dev: ^2.20.2
  flutter_launcher_icons: ^0.13.1
  # Testing framework enhancements
  mocktail: ^1.0.4
  integration_test:
    sdk: flutter

flutter_launcher_icons:
  android: true
  ios: true
  image_path: assets/logo2.png

flutter:
  uses-material-design: true
  generate: true
  assets:
    - assets/logo.svg
    - assets/bee.svg
    - assets/logo.png
    - assets/logo2.png
  # 字体已移动到可选依赖,使用系统字体以减少应用体积
  # fonts:
  #   - family: Inter
  #     fonts:
  #       - asset: assets/fonts/Inter-Regular.ttf
  #       - asset: assets/fonts/Inter-Medium.ttf
  #         weight: 500
  #       - asset: assets/fonts/Inter-SemiBold.ttf
  #         weight: 600
  #       - asset: assets/fonts/Inter-Bold.ttf
  #         weight: 700
  #   - family: NotoSansSC
  #     fonts:
  #       - asset: assets/fonts/NotoSansSC-Regular.ttf
  #       - asset: assets/fonts/NotoSansSC-Medium.ttf
  #         weight: 500
  #       - asset: assets/fonts/NotoSansSC-SemiBold.ttf
  #         weight: 600
  #       - asset: assets/fonts/NotoSansSC-Bold.ttf
  #         weight: 700

dependency_overrides:
  # OpenHarmony Flutter Packages
  path_provider:
    git:
      url: https://gitcode.com/openharmony-sig/flutter_packages.git
      path: packages/path_provider/path_provider

  shared_preferences:
    git:
      url: https://gitcode.com/openharmony-sig/flutter_packages.git
      path: packages/shared_preferences/shared_preferences

  url_launcher:
    git:
      url: https://gitcode.com/openharmony-sig/flutter_packages.git
      path: packages/url_launcher/url_launcher

  # permission_handler:
  #   git:
  #     url: https://gitcode.com/openharmony-sig/flutter_packages.git
  #     path: packages/permission_handler/permission_handler

  # # OpenHarmony Flutter Plus Plugins
  package_info_plus:
    git:
      url: https://gitcode.com/openharmony-sig/flutter_plus_plugins.git
      path: packages/package_info_plus/package_info_plus

  share_plus:
    git:
      url: https://gitcode.com/openharmony-sig/flutter_plus_plugins.git
      path: packages/share_plus/share_plus

  # SQLite OpenHarmony Adaptation (sqflite)
  sqflite:
    git:
      url: https://gitee.com/openharmony-sig/flutter_sqflite.git
      path: sqflite
      ref: master

  sqflite_common_ffi:
    git:
      url: https://gitee.com/openharmony-sig/flutter_sqflite.git
      path: sqflite_common_ffi
      ref: master

  # flutter_local_notifications OpenHarmony Adaptation
  flutter_local_notifications:
    git:
      url: https://gitcode.com/openharmony-sig/fluttertpc_flutter_local_notifications.git
      path: flutter_local_notifications

  # file_selector OpenHarmony Adaptation
  file_selector:
    git:
      url: https://gitcode.com/openharmony-sig/flutter_packages.git
      path: packages/file_selector/file_selector

  # file_picker OpenHarmony Adaptation
  file_picker:
    git:
      url: https://gitcode.com/openharmony-sig/fluttertpc_file_picker.git
      ref: br_v8.0.7_ohos

如会上沟通。依赖库的问题已经解决了,使用该库时选择文件夹的问题,当前HarmonyOS适配化file_picker通过设置selectMode选择文件夹只支持PC/2in1设备。

完整的pubspec.yaml

鸿蒙Next版flutter3.27.5-ohos-1.0.0中,file_picker插件启动报错通常由插件与鸿蒙Next的API不兼容或权限配置问题导致。请检查插件是否为适配鸿蒙Next的版本,并确认在module.json5中已正确声明必要的文件访问权限(如ohos.permission.READ_MEDIA)。

根据您提供的信息,这是一个在HarmonyOS Next(即您提到的6.0.0)上使用Flutter for HarmonyOS(flutter3.27.5-ohos-1.0.0)时,file_picker插件不兼容导致的运行时错误。

核心问题分析: file_picker 是一个重度依赖原生平台(Android/iOS)文件系统API的Flutter插件。其HarmonyOS版本的适配工作可能尚未完成,或者当前版本(flutter3.27.5-ohos-1.0.0)的Flutter引擎与插件的原生层代码存在不兼容。附件中的日志(虽未直接提供)通常会包含具体的原生层崩溃信息或找不到类/方法的错误,这直接指向插件原生鸿蒙实现部分的缺失或接口变更。

当前可行的技术方案:

您已经找到了一个有效的替代方案:使用 file_selector。为了保持代码在iOS、Android和HarmonyOS上的统一,避免分叉,建议采用 “条件导出”“抽象接口” 的模式来封装平台相关的文件选择操作。

  1. 创建平台无关的抽象层: 定义一个统一的Dart抽象类(如 FilePickerInterface)或一个简单的函数签名,封装“选择文件”这个功能。

  2. 实现平台特定的适配器

    • 对于 Android 和 iOS:继续使用 file_picker 插件,编写一个适配器类来实现上述抽象接口。
    • 对于 HarmonyOS:使用 file_selector 插件,编写另一个适配器类来实现相同的抽象接口。
  3. 使用条件导入进行分发: 利用Dart的 importexport 语句配合条件导出的机制,在编译时根据目标平台自动选择正确的实现。

    示例代码结构:

    • lib/file_picker_interface.dart (抽象接口)
    • lib/file_picker_mobile.dart (实现:使用 file_picker,通过 dart.library.io 条件导出给Android/iOS)
    • lib/file_picker_harmony.dart (实现:使用 file_selector,通过 dart.library.ohos 条件导出给HarmonyOS)
    • pubspec.yaml 中,将 file_pickerfile_selector 都列为依赖项。

通过这种方式,您的业务逻辑代码始终调用统一的接口,底层实现根据运行平台自动切换,从而实现了一套代码兼容三个平台,无需为HarmonyOS维护独立的分支代码。

结论: 目前,在 file_picker 插件未发布完全兼容HarmonyOS Next的稳定版本前,采用上述抽象层加条件导入的方案是解决此类三方插件兼容性问题的最佳实践。这既能立即解决HarmonyOS上的运行错误,又能确保多平台代码库的整洁和可维护性。请关注 file_picker 插件的官方更新,未来可能提供完整的HarmonyOS支持后,可以简化此结构。

回到顶部