
10. Flutter调用鸿蒙原生能力前置课MethodChannel和PlatformView准备当 Flutter 页面需要调用鸿蒙系统能力、复用 ArkTS 组件或嵌入原生视图时就要进入 Flutter 与鸿蒙原生交互。正式写插件前先把 MethodChannel、PlatformView、参数传递和目录位置弄清楚。两种常见交互方式MethodChannel适合方法调用例如获取原生计算结果、读取系统信息、调用鸿蒙能力。PlatformView适合视图嵌入例如把鸿蒙原生 Swiper、地图、播放器或已有 ArkTS 页面局部嵌入 Flutter 页面。MethodChannelFlutter 发起方法调用 - ArkTS 执行 - 返回结果 PlatformViewFlutter 预留视图区域 - 鸿蒙侧创建原生视图 - 嵌入显示Flutter 侧 MethodChannelimportpackage:flutter/services.dart;classNativeBridge{staticconstMethodChannel_channelMethodChannel(demo/native_channel);staticFutureintadd(int a,int b)async{finalresultawait_channel.invokeMethodint(add,{a:a,b:b,});returnresult??0;}staticFutureStringgetDeviceName()async{finalresultawait_channel.invokeMethodString(getDeviceName);returnresult??;}}页面调用finalsumawaitNativeBridge.add(10,20);finaldeviceNameawaitNativeBridge.getDeviceName();鸿蒙侧目录规划ohos/entry/src/main/ets ├─ entryability │ └─ EntryAbility.ets └─ plugins ├─ NativeBridgePlugin.ets └─ NativeViewFactory.etsEntryAbility.ets负责生命周期和插件注册plugins目录放具体插件逻辑。不要把所有逻辑都写进 EntryAbility否则后面方法变多会很难维护。参数设计通道参数尽量使用简单 JSON 类型字符串、数字、布尔值、数组、对象。Flutter 侧和鸿蒙侧字段名要固定例如await_channel.invokeMethod(openPage,{pageName:detail,id:1001,readonly:true,});字段名确定后不要随意修改否则 Flutter 调用和 ArkTS 解析很容易对不上。PlatformView 准备Flutter 侧可以先封装一个 Widget业务页面只使用这个 WidgetclassNativeSwiperBoxextendsStatelessWidget{constNativeSwiperBox({super.key});overrideWidgetbuild(BuildContextcontext){returnconstSizedBox(height:220,child:OhosView(viewType:demo/native_swiper,creationParams:{autoplay:true,interval:3000,},creationParamsCodec:StandardMessageCodec(),),);}}具体平台视图类名要以项目当前 Flutter OpenHarmony 版本提供的 API 为准。如果项目中已经做过二次封装业务页面优先使用封装后的组件。桥接检查正式写原生交互前先核对[ ] 通道名称固定且唯一 [ ] 方法名使用常量或集中管理 [ ] 参数字段有明确类型 [ ] Flutter 侧处理异常 [ ] 鸿蒙侧处理缺失参数 [ ] 插件注册位置清楚 [ ] 原生视图 viewType 与 Flutter 侧一致这些准备做好后就可以继续扩展到 Flutter 调用鸿蒙原生组件、Flutter 嵌入鸿蒙原生 Swiper、Flutter 与鸿蒙原生互相传参等实战内容。通道命名规范通道名称要像包名一样稳定com.example.demo/native_channel com.example.demo/native_swiper不要用test、demo、channel1这种临时名称。通道名一旦写进 Flutter 和 ArkTS 两端后续随意修改就会导致调用失败。异常处理不能省Flutter 侧调用原生能力时要处理异常try{finalvalueawaitNativeBridge.add(1,2);debugPrint(native result:$value);}onPlatformExceptioncatch(e){debugPrint(native error:${e.code},${e.message});}catch(e){debugPrint(unknown error:$e);}鸿蒙侧也要对缺失参数、类型错误、未知方法给出明确返回。桥接代码最怕静默失败调用方不知道是没注册、方法名错了还是参数解析失败。e}, ${e.message});} catch (e) {debugPrint(‘unknown error: $e’);}鸿蒙侧也要对缺失参数、类型错误、未知方法给出明确返回。桥接代码最怕静默失败调用方不知道是没注册、方法名错了还是参数解析失败。