Flutter——最详细原生交互(MethodChannel、EventChannel、BasicMessageChannel)使用教程

06-01 1268阅读
  1. MethodChannel(方法通道)

    用途:实现 双向通信,用于调用原生平台提供的 API 并获取返回结果。

    场景:适合一次性操作,如调用相机、获取设备信息等。

使用步骤:

  • Flutter 端:通过 MethodChannel监听事件流。
      static const platform =
          MethodChannel('com.example.fltest.plugin.DeviceInfoPlugin');
    
    • Android 端(Kotlin)
          private var methodChannel: MethodChannel? = null
        val CHANNEL: String = "com.example.fltest.plugin.DeviceInfoPlugin"
        
        private fun getPhoneNumber(): Any? {
              val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager?
      //        val phoneNumber = telephonyManager!!.line1Number
              val phoneNumber = "18627000332"
              return phoneNumber
          }
      
      1. EventChannel(事件通道)

        用途:实现 单向数据流,用于原生平台向 Flutter 持续发送事件(如传感器数据)。

        场景:适合实时数据流,如监听陀螺仪、GPS 位置更新等。

        使用步骤:

      • Flutter 端:通过 EventChannel 监听事件流。
        static const eventChannel =
              EventChannel('com.example.fltest.plugin.DeviceInfoPlugin/event');
          Stream get _batteryLevelStream {
            return eventChannel.receiveBroadcastStream("111").cast();
          }
        
        • Android 端(Kotlin)
           
          class DeviceInfoPlugin(var context: Context) : EventChannel.StreamHandler, FlutterPlugin {
              private var eventChannel: EventChannel? = null
              val EVENT_CHANNEL: String = "com.example.fltest.plugin.DeviceInfoPlugin/event"
              override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
                      result.notImplemented()
              }
              override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {
                  setupChannels(binding.binaryMessenger, binding.applicationContext)
              }
              override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
                  teardownChannels()
              }
              private fun setupChannels(messenger: BinaryMessenger, context: Context) {
                  this.context = context
                  eventChannel = EventChannel(messenger, EVENT_CHANNEL)
                  eventChannel?.setStreamHandler(this)
              }
              private fun teardownChannels() {
                  eventChannel?.setStreamHandler(null)
                  eventChannel = null
              }
              private val mainHandler = Handler(Looper.getMainLooper())
              override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {
                  Toast.makeText(context, arguments.toString(), Toast.LENGTH_SHORT).show()
                  events?.let {
                      sendBatteryLevel(it)
                      events.success(1)
                      mainHandler.postDelayed({
                          events.success(2)
                      }, 2000)
                      mainHandler.postDelayed({ events.success(3) }, 4000)
                  }
              }
              override fun onCancel(arguments: Any?) {
              }
              private fun sendBatteryLevel(events: EventChannel.EventSink) {
                  val batteryLevel = -1
                  if (batteryLevel != -1) {
                      events.success(batteryLevel)
                  } else {
                      events.error("UNAVAILABLE", "Battery level not available.", null);
                  }
              }
          }
          
          1. BasicMessageChannel(基础消息通道)

            用途:支持 异步消息传递,使用自定义编解码器传递数据。

            场景:适合简单的数据交换(如 JSON、二进制数据)。

          使用步骤:

          • Flutter 端:通过 BasicMessageChannel监听事件流。
              final BasicMessageChannel messageChannel =
                  BasicMessageChannel(
                'com.example.fltest.plugin.DeviceInfoPlugin/basicMessage',
                StringCodec(),
              );
              
            // 发送消息
            Future sendMessage(String message) async {
              return await messageChannel.send(message);
            }
                @override
              void initState() {
                super.initState();
                // 设置消息处理器
                messageChannel.setMessageHandler((String? message) async {
                  print('Received message from native: $message');
                  return '$message';
                });
              }
              
            
            • Android 端(Kotlin)
              package com.example.fltest.plugin
              import android.content.Context
              import android.os.Handler
              import android.os.Looper
              import android.telephony.TelephonyManager
              import android.widget.Toast
              import io.flutter.embedding.engine.plugins.FlutterPlugin
              import io.flutter.plugin.common.BasicMessageChannel
              import io.flutter.plugin.common.BasicMessageChannel.Reply
              import io.flutter.plugin.common.BinaryMessenger
              import io.flutter.plugin.common.EventChannel
              import io.flutter.plugin.common.MethodCall
              import io.flutter.plugin.common.MethodChannel
              import io.flutter.plugin.common.MethodChannel.MethodCallHandler
              import io.flutter.plugin.common.StandardMessageCodec
              import io.flutter.plugin.common.StringCodec
              class DeviceInfoPlugin(var context: Context) :  FlutterPlugin {
                  private var basicMessageChannel: BasicMessageChannel? = null
                  val BASIC_MESSAGE_CHANNEL: String = "com.example.fltest.plugin.DeviceInfoPlugin/basicMessage"
                  override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
                    
                          result.notImplemented()
                     
                  }
                  override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {
                      setupChannels(binding.binaryMessenger, binding.applicationContext)
                  }
                  override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
                      teardownChannels()
                  }
                  private fun setupChannels(messenger: BinaryMessenger, context: Context) {
                      this.context = context
                      basicMessageChannel = BasicMessageChannel(messenger, BASIC_MESSAGE_CHANNEL, StringCodec.INSTANCE)
                      basicMessageChannel?.setMessageHandler { message, reply ->
                          println("Received message from Flutter: $message")
                          reply.reply("Message received")
                          basicMessageChannel?.send(message
                          ) { reply -> Toast.makeText(context, reply.toString(), Toast.LENGTH_SHORT).show() }
                      }
                      // 发送消息
              basicMessageChannel.send("Hello from Android") { reply ->
                  Log.d("TAG", "Reply: $reply")
              }
                  }
                  private fun teardownChannels() {
                     
                  }
                  
                  override fun onCancel(arguments: Any?) {
                  }
              }
              

              在MainActivity初始化添加插件类

              package com.example.fltest
              import com.example.fltest.plugin.DeviceInfoPlugin
              import io.flutter.embedding.android.FlutterActivity
              import io.flutter.embedding.engine.FlutterEngine
              class MainActivity: FlutterActivity(){
                  override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
                      super.configureFlutterEngine(flutterEngine)
                      flutterEngine.plugins.add(DeviceInfoPlugin(this))
                  }
              }
              

              总结:

              方法方向使用场景
              MethodChannel双向调用原生 API 并获取结果
              EventChannel单向(原生→Flutter)监听持续事件(如传感器)
              BasicMessageChannel双向简单消息传递(字符串、二进制数据)

              根据具体需求选择合适的方式,可覆盖绝大多数跨平台交互场景。

              Flutter——最详细原生交互(MethodChannel、EventChannel、BasicMessageChannel)使用教程
              (图片来源网络,侵删)
              Flutter——最详细原生交互(MethodChannel、EventChannel、BasicMessageChannel)使用教程
              (图片来源网络,侵删)
              Flutter——最详细原生交互(MethodChannel、EventChannel、BasicMessageChannel)使用教程
              (图片来源网络,侵删)
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码