【实战踩坑】Flutter 插件鸿蒙化适配全流程(以 memory_info 为例)

张开发
2026/4/7 14:09:58 15 分钟阅读

分享文章

【实战踩坑】Flutter 插件鸿蒙化适配全流程(以 memory_info 为例)
【实战踩坑】Flutter 插件鸿蒙化适配全流程以 memory_info 为例欢迎加入开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.net随着鸿蒙生态的不断发展Flutter 的鸿蒙化适配成了许多开发者的必经之路。目前纯 Dart 层的适配已经相对平滑但涉及到原生插件的适配时往往会遇到不少暗坑。最近我完成了memory_info插件的鸿蒙化适配中间经历了 IDE 打不开、路径编码报错、Channel 不通等各种问题。本文将保姆式分享我的完整适配记录与踩坑解决方案希望能帮到正在折腾鸿蒙适配的你。一、 环境配置稳扎稳打1.1 准备工具链IDE下载安装 DevEco StudioFlutter SDK我们需要使用专门适配了鸿蒙的分支。在终端依次执行D:mkdirFlutter_SDKcdFlutter_SDKgitclone-boh-3.27.4-dev https://atomgit.com/openharmony-tpc/flutter_flutter.git1.2 配置 Windows 环境变量由于鸿蒙编译依赖 DevEco 的工具链必须配置以下环境变量新建系统变量DEVECO_SDK_HOME值指向你的 SDK 路径例如D:\DevEco\DevEcoStudio\sdk。在用户的Path中追加以下路径请根据你的实际安装路径修改D:\Flutter_SDK\flutter_flutter\bin D:\DevEco\DevEcoStudio\sdk\default\openharmony\toolchains D:\DevEco\DevEcoStudio\tools\ohpm\bin D:\DevEco\DevEcoStudio\tools\node D:\DevEco\DevEcoStudio\tools\hvigor\bin1.3 验证环境打开终端运行flutter doctor。 避坑提示只要HarmonyOS toolchain前面是 ✅环境就 OK 了其他安卓相关的 ❌ 完全可以忽略。如果 HarmonyOS 显示 ✗请仔细检查DEVECO_SDK_HOME路径是否完全正确。如下图所示HarmonyOS toolchain 显示 ✅二、 插件工程初始化与覆盖陷阱以memory_info为例我们先拉取源码并生成鸿蒙平台目录。2.1 配置国内镜像必须因为pub.dev在国内不稳定生成目录前务必先配置用户环境变量PUB_HOSTED_URLhttps://pub.flutter-io.cnFLUTTER_STORAGE_BASE_URLhttps://storage.flutter-io.cn2.2 生成 ohos 目录cdD:\Flutter_HarmonyOS\memory_info flutter create.--templateplugin--platformsohos看到输出Generated 67 files...且生成了ohos/目录说明基础结构搭建完成。 踩坑一pubspec.yaml 被无情覆盖问题执行上述命令后虽然生成了ohos配置但原本的android和ios配置被清空了解决必须手动把缺失的平台配置加回去。打开pubspec.yaml将flutter节点修改如下flutter:plugin:platforms:android:package:com.mrololo.memory_infopluginClass:MemoryInfoPluginios:pluginClass:MemoryInfoPluginohos:package:com.mrololo.memory_infopluginClass:MemoryInfoPlugin保存后执行flutter pub get无报错即可进入下一步。三、 DevEco Studio 阶段性发疯指南在写代码之前IDE 先给我上了两课。 踩坑二DevEco Studio 双击无反应现象双击快捷方式没反应任务管理器里有进程但起不来。排查与解决兼容性设置右键快捷方式 - 属性 - 兼容性勾选以管理员身份运行和禁用全屏优化。关键步骤权限问题进入 DevEco Studio 安装目录右键 - 属性 - 安全 - 高级。选中Users组赋予完全控制权限并勾选替换所有子对象的权限项目。杀掉后台残留进程再次打开即可。 踩坑三路径编码错误出现 %20现象用 DevEco 打开oh-package.json5时报错路径出现奇怪的%20编码。原因鸿蒙工具链对路径极其敏感绝对不允许中文、空格、特殊符号。解决检查后发现我的安装路径是D:\download\DevEco_studio\DevEco Studio中间有空格。只能将 DevEco Studio 卸载重新安装到一个纯英文无空格的路径下如D:\DevEco\DevEcoStudio。四、 编译运行与签名配置4.1 启动模拟器在 DevEco Studio 顶部菜单Tools - Device Manager新建一个模拟器如 Pixel_30按提示下载镜像并启动。终端执行flutter devices能看到设备名称说明连接成功。 踩坑四spawn java ENOENT现象执行flutter run时报错spawn java ENOENT。原因鸿蒙的编译工具 hvigor 强依赖 Java 环境。解决确保本机安装了 JDK 并配置了JAVA_HOME环境变量。4.2 自动签名必须鸿蒙真机/模拟器运行必须签名。最简单的方法用 DevEco Studio 打开示例项目D:\Flutter_HarmonyOS\memory_info\example\ohos点击File - Project Structure - Signing Configs勾选Automatically generate signature点击 OK。关闭 IDE 后回到终端重新运行。五、 核心业务适配与 MethodChannel 调试示例工程跑起来后发现只有一个空白页面没有任何交互。这是因为官方模板没写测试 UI。我们需要手动搭建测试环境并在鸿蒙侧实现原生逻辑。5.1 修改 Dart 侧示例代码修改example/lib/main.dart添加按钮和展示区域注意这里统一了 Channel 名称importpackage:flutter/material.dart;importpackage:flutter/services.dart;voidmain(){runApp(MyApp());}classMyAppextendsStatefulWidget{override_MyAppStatecreateState()_MyAppState();}class_MyAppStateextendsStateMyApp{String_memoryInfo点击按钮获取内存信息;// 注意这里的 channel 名称必须与原生侧一致staticconstplatformMethodChannel(memory_info);void_getMemoryInfo()async{try{finalresultawaitplatform.invokeMethod(getMemoryInfo);if(result!nullresultisMap){setState((){_memoryInfo 内存信息 \n总内存: ${result[total]} MB\n可用内存: ${result[free]} MB\n应用占用: ${result[usedByApp]} MB\n应用大小: ${result[appSize] ?? 获取失败} MB;});}}catch(e){setState((){_memoryInfo获取失败:$e;});}}overrideWidgetbuild(BuildContextcontext){returnMaterialApp(home:Scaffold(appBar:AppBar(title:Text(Memory Info Demo - 鸿蒙适配)),body:Center(child:Column(mainAxisAlignment:MainAxisAlignment.center,children:[Container(padding:EdgeInsets.all(16),decoration:BoxDecoration(color:Colors.blue[50],borderRadius:BorderRadius.circular(12),),child:Text(_memoryInfo,textAlign:TextAlign.center,style:TextStyle(fontSize:16)),),SizedBox(height:30),ElevatedButton(onPressed:_getMemoryInfo,child:Text(获取内存信息,style:TextStyle(fontSize:18)),),],),),),);}} 踩坑五MissingPluginException 找不到实现现象点击按钮报错MissingPluginException(No implementation found for method getMemoryInfo on channel com.nutpi.memory_info)。原因鸿蒙侧.ets文件没有实现该方法。Dart 侧和鸿蒙侧的MethodChannel名称不一致Dart 侧用了com.nutpi.memory_info而鸿蒙侧默认注册的是memory_info。解决编写鸿蒙原生实现。打开ohos/src/main/ets/components/plugin/MemoryInfoPlugin.ets补充完整逻辑import{FlutterPlugin,FlutterPluginBinding,MethodCall,MethodCallHandler,MethodChannel,MethodResult}fromohos/flutter_ohos;import{storageStatistics}fromkit.CoreFileKit;import{BusinessError}fromkit.BasicServicesKit;import{hidebug}fromkit.PerformanceAnalysisKit;exportdefaultclassMemoryInfoPluginimplementsFlutterPlugin,MethodCallHandler{privatechannel:MethodChannel|nullnull;getUniqueClassName():string{returnMemoryInfoPlugin;}onAttachedToEngine(binding:FlutterPluginBinding):void{// 注意这里的名称必须与 Dart 侧完全一致this.channelnewMethodChannel(binding.getBinaryMessenger(),memory_info);this.channel.setMethodCallHandler(this);}onDetachedFromEngine(binding:FlutterPluginBinding):void{if(this.channel!null){this.channel.setMethodCallHandler(null);}}onMethodCall(call:MethodCall,result:MethodResult):void{if(call.methodgetPlatformVersion){result.success(OpenHarmony ^^);}elseif(call.methodgetMemoryInfo){constInfonewMapstring,number();constmbFactor1024*1024;// 获取系统内存信息letsystemMemInfo:hidebug.SystemMemInfohidebug.getSystemMemInfo();Info.set(total,Number(systemMemInfo.totalMem)/mbFactor);Info.set(free,Number(systemMemInfo.freeMem)/mbFactor);Info.set(usedByApp,Number(systemMemInfo.availableMem)/mbFactor);// 获取应用占用空间storageStatistics.getCurrentBundleStats((err:BusinessError,bundleStats:storageStatistics.BundleStats){if(err){console.error(getCurrentBundleStats failed:${err.message});}else{Info.set(appSize,Number(bundleStats.appSize)/mbFactor);}result.success(Info);});}else{result.notImplemented();}}} 踩坑六修改原生代码后热重载无效现象改完.ets文件后在终端按r热重载按钮依然报错。原因热重载r和热重启R只更新 Dart 层代码不会重新编译鸿蒙原生代码解决必须先按q退出运行然后执行清理并重新编译flutter clean flutter run最终成果重新编译运行后点击模拟器上的按钮成功获取到鸿蒙设备的内存信息如下图所示总结Flutter 插件的鸿蒙化适配难点往往不在于业务逻辑本身而在于工程环境的规范和双端通信的细节。总结几个核心口诀路径必须纯坚决杜绝中文和空格。配置别被吞使用flutter create追加平台时检查pubspec.yaml原有配置。Channel 要对齐Dart 和 ArkTS 两边的字符串哪怕差一个字符都会NotImplemented。改原生必 Clean养成修改.ets/.java/.kt后flutter clean的习惯。希望这篇踩坑记录能为你节省几个小时的排错时间祝大家鸿蒙适配顺利标签/Tags推荐#Flutter #鸿蒙开发 #HarmonyOS #跨平台 #前端 #移动端开发 #开源插件适配

更多文章