在 Flutter 混合开发中Android 原生层通知 Dart 界面更新状态主要通过MethodChannel的invokeMethod从原生调用 Dart或者使用EventChannel建立持续的数据流。方案一MethodChannel 单向通知简单场景Android 原生层调用 Dart// MainActivity.kt 或 Service.ktimportio.flutter.plugin.common.MethodChannelclassMainActivity:FlutterActivity(){privatelateinitvarchannel:MethodChanneloverridefunconfigureFlutterEngine(flutterEngine:FlutterEngine){super.configureFlutterEngine(flutterEngine)channelMethodChannel(flutterEngine.dartExecutor.binaryMessenger,flutter_launcher)// Dart 调用原生的处理器channel.setMethodCallHandler{call,result-when(call.method){getSystemInfo-result.success(getSystemInfo())else-result.notImplemented()}}}/** * 主动通知 Dart 更新例如电池变化、应用安装/卸载 */funnotifyDart(event:String,data:MapString,Any){// 在主线程调用runOnUiThread{channel.invokeMethod(event,data)}}/** * 示例电池变化时通知 Dart */funonBatteryChanged(level:Int){notifyDart(onBatteryChanged,mapOf(leveltolevel))}/** * 示例应用安装/卸载时通知 Dart */funonAppChanged(action:String,packageName:String){notifyDart(onAppChanged,mapOf(actiontoaction,// installed | uninstalled | updatedpackagetopackageName))}}Dart 层接收通知// lib/services/desktop_service.dartimportdart:async;importpackage:flutter/services.dart;classDesktopService{staticconstMethodChannel_channelMethodChannel(flutter_launcher);// 状态流控制器staticfinal_batteryControllerStreamControllerint.broadcast();staticfinal_appChangeControllerStreamControllerMapString,dynamic.broadcast();// 公开的数据流staticStreamintgetbatteryStream_batteryController.stream;staticStreamMapString,dynamicgetappChangeStream_appChangeController.stream;staticvoidinit(){// 设置方法调用处理器接收原生通知_channel.setMethodCallHandler(_handleMethodCall);}staticFuturedynamic_handleMethodCall(MethodCallcall)async{switch(call.method){caseonBatteryChanged:finallevelcall.arguments[level]asint?;if(level!null){_batteryController.add(level);}returnnull;caseonAppChanged:finaldatacall.argumentsasMapdynamic,dynamic;_appChangeController.add({action:data[action],package:data[package],});returnnull;caseonTimeTick:// 每分钟通知returnnull;caseonWifiChanged:finalenabledcall.arguments[enabled]asbool?;// 通知WiFi状态变化returnnull;default:returnnull;}}// 主动调用原生方法staticFutureMapString,dynamicgetSystemInfo()async{finalresultawait_channel.invokeMethod(getSystemInfo);return_toStringMap(result);}staticFuturevoidlaunchApp(Stringpackage)async{await_channel.invokeMethod(launchApp,{package:package});}staticMapString,dynamic_toStringMap(dynamicdata){if(datanull)return{};finalmapdataasMapdynamic,dynamic;returnmap.map((k,v)MapEntry(k.toString(),v));}staticvoiddispose(){_batteryController.close();_appChangeController.close();}}UI 层监听状态变化// lib/widgets/status_bar.dartimportpackage:flutter/material.dart;import../services/desktop_service.dart;classStatusBarextendsStatefulWidget{constStatusBar({super.key});overrideStateStatusBarcreateState()_StatusBarState();}class_StatusBarStateextendsStateStatusBar{int _battery100;bool _wififalse;String_time;overridevoidinitState(){super.initState();// 初始化服务DesktopService.init();// 监听电池变化来自原生通知DesktopService.batteryStream.listen((level){setState(()_batterylevel);});// 定时刷新时间Stream.periodic(constDuration(seconds:1)).listen((_){setState((){_time${DateTime.now().hour.toString().padLeft(2, 0)}:${DateTime.now().minute.toString().padLeft(2, 0)};});});// 初始加载_loadSystemInfo();}Futurevoid_loadSystemInfo()async{finalinfoawaitDesktopService.getSystemInfo();setState((){_batteryinfo[battery]??100;_wifiinfo[wifi]??false;});}overrideWidgetbuild(BuildContextcontext){returnContainer(height:36,color:Colors.black.withOpacity(0.6),padding:constEdgeInsets.symmetric(horizontal:12),child:Row(children:[Text(_time,style:constTextStyle(color:Colors.white)),constSpacer(),Icon(_wifi?Icons.wifi:Icons.wifi_off,color:Colors.white,size:18),constSizedBox(width:8),Text($_battery%,style:constTextStyle(color:Colors.white)),],),);}}方案二EventChannel 持续数据流适合高频数据Android 原生层// service/SystemEventChannel.ktpackagecom.example.flutter_launcher.serviceimportio.flutter.plugin.common.EventChannelimportio.flutter.plugin.common.EventChannel.EventSinkclassSystemEventChannel:EventChannel.StreamHandler{privatevareventSink:EventSink?nulloverridefunonListen(arguments:Any?,events:EventSink?){eventSinkeventsstartListening()}overridefunonCancel(arguments:Any?){eventSinknullstopListening()}/** * 发送事件到 Dart */funsendEvent(event:String,data:Any){eventSink?.success(mapOf(eventtoevent,datatodata))}privatefunstartListening(){// 注册系统监听器电池、WiFi、时间等}privatefunstopListening(){// 注销监听器}}Dart 层// lib/services/event_service.dartimportdart:async;importpackage:flutter/services.dart;classEventService{staticconstEventChannel_eventChannelEventChannel(flutter_launcher/events);staticStreamMapString,dynamic?_eventStream;staticStreamMapString,dynamicgeteventStream{_eventStream??_eventChannel.receiveBroadcastStream().map((event){finalmapeventasMapdynamic,dynamic;return{event:map[event],data:map[data],};});return_eventStream!;}}方案三BroadcastReceiver 通知系统事件Android 原生层监听系统广播// receiver/SystemEventReceiver.ktpackagecom.example.flutter_launcher.receiverimportandroid.content.BroadcastReceiverimportandroid.content.Contextimportandroid.content.Intentimportandroid.content.IntentFilterimportandroid.os.BatteryManagerclassSystemEventReceiver(privatevalonEvent:(String,MapString,Any)-Unit):BroadcastReceiver(){funregister(context:Context){valfilterIntentFilter().apply{addAction(Intent.ACTION_BATTERY_CHANGED)addAction(Intent.ACTION_TIME_TICK)addAction(Intent.ACTION_TIME_CHANGED)addAction(Intent.ACTION_PACKAGE_ADDED)addAction(Intent.ACTION_PACKAGE_REMOVED)addAction(Intent.ACTION_PACKAGE_REPLACED)addAction(android.net.wifi.STATE_CHANGE)}context.registerReceiver(this,filter)}fununregister(context:Context){context.unregisterReceiver(this)}overridefunonReceive(context:Context,intent:Intent){when(intent.action){Intent.ACTION_BATTERY_CHANGED-{vallevelintent.getIntExtra(BatteryManager.EXTRA_LEVEL,-1)valscaleintent.getIntExtra(BatteryManager.EXTRA_SCALE,-1)valpercent(level*100/scale).coerceIn(0,100)onEvent(battery,mapOf(leveltopercent))}Intent.ACTION_TIME_TICK,Intent.ACTION_TIME_CHANGED-{onEvent(time,mapOf(timetoSystem.currentTimeMillis()))}Intent.ACTION_PACKAGE_ADDED-{valpackageNameintent.data?.schemeSpecificPart?:onEvent(app_added,mapOf(packagetopackageName))}Intent.ACTION_PACKAGE_REMOVED-{valpackageNameintent.data?.schemeSpecificPart?:onEvent(app_removed,mapOf(packagetopackageName))}android.net.wifi.STATE_CHANGE-{valwifiManagercontext.getSystemService(Context.WIFI_SERVICE)asandroid.net.wifi.WifiManageronEvent(wifi,mapOf(enabledtowifiManager.isWifiEnabled))}}}}在 Service 或 Activity 中使用classMainActivity:FlutterActivity(){privatelateinitvareventReceiver:SystemEventReceiverprivatelateinitvarchannel:MethodChanneloverridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)channelMethodChannel(flutterEngine!!.dartExecutor.binaryMessenger,flutter_launcher)// 初始化广播接收器eventReceiverSystemEventReceiver{event,data-// 通知 DartrunOnUiThread{channel.invokeMethod(onSystemEvent,mapOf(eventtoevent,datatodata))}}eventReceiver.register(this)}overridefunonDestroy(){eventReceiver.unregister(this)super.onDestroy()}}完整状态更新流程图┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ Android 系统 │ │ Android 原生层 │ │ Flutter Dart │ │ │ │ │ │ │ │ 电池变化 │────→│ BroadcastReceiver│────→│ MethodChannel │ │ 时间变化 │ │ 或 Service 监听 │ │ setMethodCallHandler │ 应用安装/卸载 │ │ │ │ │ │ WiFi状态变化 │ │ │ │ StreamController │ │ │ │ │ 通知 UI 更新 │ └─────────────────┘ └─────────────────┘ └─────────────────┘ ↑ │ 主动查询 ┌────┴────┐ │ invokeMethod │ getSystemInfo └─────────┘推荐用法总结场景方案代码示例单次状态查询MethodChannel 双向invokeMethod(getSystemInfo)状态变化通知MethodChannel StreaminvokeMethod(onBatteryChanged)→StreamController高频数据流EventChannel电池实时变化、传感器数据系统广播事件BroadcastReceiver MethodChannel应用安装卸载、时间变化