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代码就分叉了
楼主请提供下,pubspec.yaml文件如何依赖的file_picker?
更多关于HarmonyOS 鸿蒙Next版flutter3.27.5-ohos-1.0.0, file_picker插件启动后报错的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
file_picker: git: url: https://gitcode.com/openharmony-sig/fluttertpc_file_picker.git
加一下这个分支试试: 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设备。
鸿蒙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上的统一,避免分叉,建议采用 “条件导出” 或 “抽象接口” 的模式来封装平台相关的文件选择操作。
-
创建平台无关的抽象层: 定义一个统一的Dart抽象类(如
FilePickerInterface)或一个简单的函数签名,封装“选择文件”这个功能。 -
实现平台特定的适配器:
- 对于 Android 和 iOS:继续使用
file_picker插件,编写一个适配器类来实现上述抽象接口。 - 对于 HarmonyOS:使用
file_selector插件,编写另一个适配器类来实现相同的抽象接口。
- 对于 Android 和 iOS:继续使用
-
使用条件导入进行分发: 利用Dart的
import和export语句配合条件导出的机制,在编译时根据目标平台自动选择正确的实现。示例代码结构:
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_picker和file_selector都列为依赖项。
通过这种方式,您的业务逻辑代码始终调用统一的接口,底层实现根据运行平台自动切换,从而实现了一套代码兼容三个平台,无需为HarmonyOS维护独立的分支代码。
结论:
目前,在 file_picker 插件未发布完全兼容HarmonyOS Next的稳定版本前,采用上述抽象层加条件导入的方案是解决此类三方插件兼容性问题的最佳实践。这既能立即解决HarmonyOS上的运行错误,又能确保多平台代码库的整洁和可维护性。请关注 file_picker 插件的官方更新,未来可能提供完整的HarmonyOS支持后,可以简化此结构。


