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 | 场景 |
|---|---|
MethodChannel | Flutter 调原生 API,一次性调用返回结果 |
EventChannel | 原生持续推送数据(传感器/网络/电量) |
BasicMessageChannel | 轻量双向消息 |
👉 下一节:9.2 原生插件开发
