9.1 平台通道(Platform Channel)

张开发
2026/4/15 2:14:37 15 分钟阅读

分享文章

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双向自定义编解码低频消息传递二、MethodChannel2.1 Flutter 侧classBatteryService{staticconst_channelMethodChannel(com.example.app/battery);staticFutureintgetBatteryLevel()async{try{finallevelawait_channel.invokeMethodint(getBatteryLevel);returnlevel??-1;}onPlatformExceptioncatch(e){debugPrint(Battery error:${e.message});return-1;}onMissingPluginException{debugPrint(Battery plugin not available);return-1;}}staticFutureboolisCharging()async{finalresultawait_channel.invokeMethodbool(isCharging);returnresult??false;}}2.2 Android 侧Kotlin// android/app/src/main/kotlin/.../MainActivity.ktclassMainActivity:FlutterActivity(){privatevalCHANNELcom.example.app/batteryoverridefunconfigureFlutterEngine(flutterEngine:FlutterEngine){super.configureFlutterEngine(flutterEngine)MethodChannel(flutterEngine.dartExecutor.binaryMessenger,CHANNEL).setMethodCallHandler{call,result-when(call.method){getBatteryLevel-{vallevelgetBatteryLevel()if(level!-1)result.success(level)elseresult.error(UNAVAILABLE,Battery not available,null)}isCharging-{result.success(isDeviceCharging())}else-result.notImplemented()}}}privatefungetBatteryLevel():Int{valbatteryManagergetSystemService(BATTERY_SERVICE)asBatteryManagerreturnbatteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)}}2.3 iOS 侧Swift// ios/Runner/AppDelegate.swiftUIApplicationMainobjcclassAppDelegate:FlutterAppDelegate{overridefuncapplication(_application:UIApplication,didFinishLaunchingWithOptions options:[UIApplication.LaunchOptionsKey:Any]?)-Bool{letcontrollerwindow?.rootViewControlleras!FlutterViewControllerletchannelFlutterMethodChannel(name:com.example.app/battery,binaryMessenger:controller.binaryMessenger)channel.setMethodCallHandler{call,resultinswitchcall.method{casegetBatteryLevel:letdeviceUIDevice.current device.isBatteryMonitoringEnabledtrueifdevice.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)}}三、EventChannel3.1 Flutter 侧监听流classNetworkStatusService{staticconst_channelEventChannel(com.example.app/network);staticStreamboolgetonConnectivityChanged{return_channel.receiveBroadcastStream().map((event)eventasbool);}}// 使用classConnectivityWidgetextendsStatefulWidget{...}class_StateextendsStateConnectivityWidget{StreamSubscription?_sub;bool _isConnectedtrue;overridevoidinitState(){super.initState();_subNetworkStatusService.onConnectivityChanged.listen((connected){setState(()_isConnectedconnected);});}overridevoiddispose(){_sub?.cancel();super.dispose();}}3.2 Android 侧KotlinclassConnectivityStreamHandler(context:Context):EventChannel.StreamHandler{privatevalconnectivityManagercontext.getSystemService(Context.CONNECTIVITY_SERVICE)asConnectivityManagerprivatevarcallback:ConnectivityManager.NetworkCallback?nulloverridefunonListen(arguments:Any?,events:EventChannel.EventSink){callbackobject: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)}callbacknull}}四、BasicMessageChannel// 双向通信不需要请求-响应模式适合消息传递staticconst_messageChannelBasicMessageChannelString(com.example.app/messages,StringCodec(),);// 发送消息到原生await_messageChannel.send(Hello from Flutter);// 监听来自原生的消息_messageChannel.setMessageHandler((message)async{print(Message from native:$message);returnFlutter received:$message;// 可选的回复});小结Channel场景MethodChannelFlutter 调原生 API一次性调用返回结果EventChannel原生持续推送数据传感器/网络/电量BasicMessageChannel轻量双向消息 下一节9.2 原生插件开发

更多文章