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

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

  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<int> get _batteryLevelStream {
    return eventChannel.receiveBroadcastStream("111").cast<int>();
  }

  • 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<String> messageChannel =
      BasicMessageChannel<String>(
    'com.example.fltest.plugin.DeviceInfoPlugin/basicMessage',
    StringCodec(),
  );
  
// 发送消息
Future<String> sendMessage(String message) async {
  return await messageChannel.send(message);
}

    
  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<String>? = 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双向简单消息传递(字符串、二进制数据)

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

相关文章:

  • Odoo 企业版用户实施手册 第二章 Odoo 实施方法论 2.4 企业需求分析和目标定义
  • 100天精通Python(爬虫篇)——第115天:爬虫在线小工具_Curl转python爬虫代码工具(快速构建初始爬虫代码)
  • 国产编辑器EverEdit - 宏功能介绍
  • deepseek 3FS编译
  • 音视频入门基础:RTP专题(14)——FFmpeg源码中,对H.264的各种RTP有效载荷结构的解析
  • 【C++】:多态
  • redis的淘汰策略
  • Linux15-epoll、数据库
  • k8s概念及k8s集群部署(Centos7)
  • 基于 Python 实现问卷数据分析的详细示例
  • AI编程工具节选
  • 【商城实战(11)】解锁商品搜索与筛选功能,提升用户购物体验
  • 数据结构与算法(两两交换链表中的结点)
  • 鬼泣:动画2
  • 桂链:区块链模型介绍
  • 【贪心算法2】
  • Manus详细介绍,Manus核心能力介绍
  • go map的声明和使用
  • windows 平台如何点击网页上的url ,会打开远程桌面连接服务器
  • 学校地摊尝试实验
  • java网站建设/seo值是什么意思
  • 乌鲁木齐哪里有做网站的公司/电子商务营销的概念
  • 网站优化专家/站长之家查询网
  • html5手机网站开发环境/网站移动端优化工具
  • 扬中网站建设包括哪些/吉安seo招聘
  • dw网站log怎么做/拉新推广怎么做代理