当前位置: 首页 > news >正文

9.1 平台通道(Platform Channel)

Platform Channel 是 Flutter 与原生平台(Android/iOS)之间通信的桥梁,允许 Dart 代码调用原生 API,或原生代码向 Flutter 推送事件。


一、通信机制概述

Flutter (Dart) Platform Channel 原生 (Java/Swift) │ │ │ MethodChannel.invokeMethod('getBatteryLevel') │ │ ─────────────────────────────────────────────────► │ │ │ 执行原生代码 │ result: 85 │ │ ◄───────────────────────────────────────────────── │ │ │ │ EventChannel.receiveBroadcastStream() │ │ ─────────────────────────────────────────────────► │ │ event: {charging: true} │ │ ◄───────────────────────────────────────────────── │ 原生推送事件

三种 Channel 类型:

Channel方向适用场景
MethodChannel双向,单次调用调用原生 API,获取返回值
EventChannel原生 → Flutter,持续流传感器、电量、网络状态变化
BasicMessageChannel双向,自定义编解码低频消息传递

二、MethodChannel

2.1 Flutter 侧

classBatteryService{staticconst_channel=MethodChannel('com.example.app/battery');staticFuture<int>getBatteryLevel()async{try{finallevel=await_channel.invokeMethod<int>('getBatteryLevel');returnlevel??-1;}onPlatformExceptioncatch(e){debugPrint('Battery error:${e.message}');return-1;}onMissingPluginException{debugPrint('Battery plugin not available');return-1;}}staticFuture<bool>isCharging()async{finalresult=await_channel.invokeMethod<bool>('isCharging');returnresult??false;}}

2.2 Android 侧(Kotlin)

// android/app/src/main/kotlin/.../MainActivity.ktclassMainActivity:FlutterActivity(){privatevalCHANNEL="com.example.app/battery"overridefunconfigureFlutterEngine(flutterEngine:FlutterEngine){super.configureFlutterEngine(flutterEngine)MethodChannel(flutterEngine.dartExecutor.binaryMessenger,CHANNEL).setMethodCallHandler{call,result->when(call.method){"getBatteryLevel"->{vallevel=getBatteryLevel()if(level!=-1)result.success(level)elseresult.error("UNAVAILABLE","Battery not available",null)}"isCharging"->{result.success(isDeviceCharging())}else->result.notImplemented()}}}privatefungetBatteryLevel():Int{valbatteryManager=getSystemService(BATTERY_SERVICE)asBatteryManagerreturnbatteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)}}

2.3 iOS 侧(Swift)

// ios/Runner/AppDelegate.swift@UIApplicationMain@objcclassAppDelegate:FlutterAppDelegate{overridefuncapplication(_application:UIApplication,didFinishLaunchingWithOptions options:[UIApplication.LaunchOptionsKey:Any]?)->Bool{letcontroller=window?.rootViewControlleras!FlutterViewControllerletchannel=FlutterMethodChannel(name:"com.example.app/battery",binaryMessenger:controller.binaryMessenger)channel.setMethodCallHandler{call,resultinswitchcall.method{case"getBatteryLevel":letdevice=UIDevice.current device.isBatteryMonitoringEnabled=trueifdevice.batteryState==.unknown{result(FlutterError(code:"UNAVAILABLE",message:"Battery not available",details:nil))}else{result(Int(device.batteryLevel*100))}default:result(FlutterMethodNotImplemented)}}returnsuper.application(application,didFinishLaunchingWithOptions:options)}}

三、EventChannel

3.1 Flutter 侧(监听流)

classNetworkStatusService{staticconst_channel=EventChannel('com.example.app/network');staticStream<bool>getonConnectivityChanged{return_channel.receiveBroadcastStream().map((event)=>eventasbool);}}// 使用classConnectivityWidgetextendsStatefulWidget{...}class_StateextendsState<ConnectivityWidget>{StreamSubscription?_sub;bool _isConnected=true;@overridevoidinitState(){super.initState();_sub=NetworkStatusService.onConnectivityChanged.listen((connected){setState(()=>_isConnected=connected);});}@overridevoiddispose(){_sub?.cancel();super.dispose();}}

3.2 Android 侧(Kotlin)

classConnectivityStreamHandler(context:Context):EventChannel.StreamHandler{privatevalconnectivityManager=context.getSystemService(Context.CONNECTIVITY_SERVICE)asConnectivityManagerprivatevarcallback:ConnectivityManager.NetworkCallback?=nulloverridefunonListen(arguments:Any?,events:EventChannel.EventSink){callback=object:ConnectivityManager.NetworkCallback(){overridefunonAvailable(network:Network){events.success(true)}overridefunonLost(network:Network){events.success(false)}}connectivityManager.registerDefaultNetworkCallback(callback!!)}overridefunonCancel(arguments:Any?){callback?.let{connectivityManager.unregisterNetworkCallback(it)}callback=null}}

四、BasicMessageChannel

// 双向通信(不需要请求-响应模式,适合消息传递)staticconst_messageChannel=BasicMessageChannel<String>('com.example.app/messages',StringCodec(),);// 发送消息到原生await_messageChannel.send('Hello from Flutter');// 监听来自原生的消息_messageChannel.setMessageHandler((message)async{print('Message from native:$message');return'Flutter received:$message';// 可选的回复});

小结

Channel场景
MethodChannelFlutter 调原生 API,一次性调用返回结果
EventChannel原生持续推送数据(传感器/网络/电量)
BasicMessageChannel轻量双向消息

👉 下一节:9.2 原生插件开发

http://www.jsqmd.com/news/642441/

相关文章:

  • Spring全家桶系列框架核心源码解析!
  • OSI模型下的数据封装全流程
  • 欧姆龙光电开关 选型手册
  • 重载 AGV 控制怎么做?这篇 2025 论文把“载荷转移”讲透了
  • 企业级微信智能客服源码系统,对接公众号与小程序
  • 基于LSTM神经网络的锂电池SOH估算模型(NASA数据集)【MATLAB】
  • 传统软件工程是不是已经噶了
  • RuoYi-v4.2 前缀
  • Qt6.8编译路径问题解析:解决QMainWindow文件缺失的三种方案
  • FUTURE POLICE语音模型与Git工作流结合:语音数据版本管理实践
  • 选品牌设计全案策划公司犯难?看这里!
  • 告别枯燥理论:用STM32CubeMx和PWM蜂鸣器,5分钟实现你的第一个嵌入式音乐盒
  • 矽力杰 Silergy SY8003 同步降压转换器 佰祥电子
  • 别让一颗小电阻毁了你的时钟!手把手教你搞定有源晶振的匹配电阻(附LVDS/CMOS选型表)
  • Swift 函数
  • 全文降AI的好处有哪些?推荐3款支持全文处理的降AI工具
  • 在VMware ESXi上部署Proxmox VE的实战指南
  • 2025届必备的六大AI学术网站实测分析
  • GraphMind:用“搭积木”的思路做的概念绘图神器
  • 大模型应用开发实战(4)——智能体经典范式
  • 无线充电效率低?掌握“加五”规则,让充电速度快起来!
  • CV实战:LBP纹理特征在Python中的高效实现与优化
  • 当AI工程进入第三层,我们把积累12年的数据「改造」了一遍
  • 从0手把手教你写AI Skill(附规范目录+可运行代码)
  • 与其他国际口罩品牌对比:回归工业颗粒物防护本质,3M为何更值得重点关注
  • 2026四川学历提升机构实力排行榜:Top8深度测评,帮你精准避坑 - 商业科技观察
  • bge-large-zh-v1.5开源模型实践:符合信创要求的国产AI基础设施部署
  • 终极指南:FakeLocation Xposed模块如何实现应用级虚拟定位
  • MoveIt Servo 如何通过 FollowJointTrajectoryControllerHandle Action Server 通信
  • 了解电爪分类与核心参数,靠谱电爪品牌挑选实用方法 - 品牌2026