Flutter 与Android 原生通信的3种基本方式的使用

一、Flutter 与 原生通信的三种基本方式以及使用场景

1.MethodChannel

主要是用于Flutter调用原生的方法(执行一个原生的行为更合适)

2.BasicMessageChannel

用于Flutter Native双向流式通信

3.EventChannel

主要用于Native平台单独向Flutter发送事件消息流,更强调单向用途,比如传感器事件监听

二、快速示例

1.MethodChannel 基本用法

以下示例在Flutter中调用一个native方法,这个方法叫做test,并且携带了一个String类型的参数

Dart端

dart 复制代码
//第一步:创建MethodChannel对象,注意ID的唯一性
const nativeMethod = MethodChannel('com.test.method');

//第二步:执行方法调用,这里执行一个叫test 的 native的方法,并且传输了一个String类型的参数
var res= await nativeMethod.invokeMethod("test","Hello I am argument");

// res 就是原生的方法返回值

kotlin端

特别注意: 关于Native端的各种Channel初始化建议都放在

FlutterActivity#configureFlutterEngine

kotlin 复制代码
//第一步:创建MethodChannel对象
var methodChanel=MethodChannel(flutterEngine!!.dartExecutor.binaryMessenger,"com.test.method");

//第二步:设置Handler
methodChanel.setMethodCallHandler { call, result ->
    run {
        if (call.method == "test") {
            //test方法回应
            result.success("Hi your argument:"+call.arguments);
        } else {
            result.notImplemented()
        }

    }
}

2.BasicMessageChannel 的基本用法

Dart端

dart 复制代码
//第一步:创建BasicMessageChannel对象并确定编解码器
BasicMessageChannel<String> basicMessageChannel = BasicMessageChannel("com.test.basic", StringCodec());

//第二步:发送消息(如果你需要)
void sendBasicMessage(String msg) {
  basicMessageChannel.send(msg);
}

//第三步:设置消息Handhdler(接受到native的消息后,你需要做什么)
void setUpReceiveMessage(Function(dynamic content) callBackContent) {
  basicMessageChannel.setMessageHandler((dynamic message) async {
    // 处理收到的消息
    print('Received message: $message');
    callBackContent(message);
    return 'Received!';
  });
}

Kotlin端

kotlin 复制代码
//第一步:初始化(在FlutterActivity#configureFlutterEngine方法中做)
//注意这里的id是com.test.basic必须和dart端保持一致
var basicMessageChannel = BasicMessageChannel(flutterEngine!!.dartExecutor.binaryMessenger, "com.test.basic", StringCodec.INSTANCE);

//第二步:设置Handler(当收到消息之后做什么)
basicMessageChannel.setMessageHandler { message, reply ->
    run {
        // 处理收到的消息
        d(tag, "收到Flutter消息 " + message);
        // 回复一个消息
        reply.reply("Reply from Java: received");
        sendMessage("Reply from Java: received");
    }
}

//第三步:sendMessage(如果你又这个需要)
private fun sendMessage(message: String) {
    basicMessageChannel.send(message) { reply: String? ->
        // 处理Dart回复的消息
        d("MainActivity", "Received reply: $reply")
    }
}

3.EventChannel的基本用法

Dart 端

dart 复制代码
///第一步 初始化EventChanel,注意这里的Channel Id需要和native保持一致
EventChannel eventChannel = EventChannel('com.test.event/channel');

// 第二步:注册监听(监听来自原生平台的数据流)
// 可以放在initState的方法中去做

void listenToNativeStream(Function(dynamic content) eventCallBack) {
  eventChannel.receiveBroadcastStream().listen((dynamic event) {
    // 处理原生平台发来的数据
    print('Received event: $event');
    eventCallBack("${event}");

  }, onError: (dynamic error) {
    // 处理错误
    print('Received error: ${error.message}');
  });
}

kotlin端

kotlin 复制代码
//第一步:初始化(建议放在FlutterActivity#configureFlutterEngine方法中)

var eventChannel =EventChannel(flutterEngine!!.dartExecutor.binaryMessenger,"com.test.event/channel")
 
// 第二步:设置流处理器
eventChannel.setStreamHandler(object : EventChannel.StreamHandler {

                //注意这里有个坑:arguments 类型必须是Any? 如果是Any可能会因为发生运行时错误
                override fun onListen(arguments: Any?, events: EventSink) {
                
                    //第三步:保存EventSink以便之后发送事件
                    eventSink = events
                    // 你可以在这里开始发送事件,比如连接到一个传感器或其他数据源
                }

                override fun onCancel(arguments: Any) {
                    // 清理资源,停止发送事件
                    eventSink = null
                }
            })
            
            
//第四步:使用EventSink发送消息
private fun sendEventToFlutter(event: String) {
    if (eventSink != null) {
        eventSink!!.success(event)
    }
}

Demo 地址

gitee.com/wangzy2018/...

相关推荐
用户2181697049302 小时前
Kotlin 语法二
android
妖星2 小时前
android 源码分析surfaceFinger是如何通过设置属性启动bootanim
android
大龄秃头程序员2 小时前
【Flutter Bloc 从 0 到 1】用最少代码跑通 Bloc
flutter
JoyMonitor2 小时前
APK mmap 内存增长定位:pagemap 与 DEX 结构联合定位方法
android
有什么事2 小时前
永久虚拟免费云手机能实现吗,本地安卓容器与云端托管的技术边界
android·智能手机
妖星2 小时前
Android 源码 .rc 语法详解
android
JMchen2 小时前
实战项目一——实现一个高性能图片滤镜App
android·c++·性能优化
m0_738185823 小时前
Flutter 鸿蒙化实战:sqflite 适配 OpenHarmony,本地 SQLite 数据库
flutter·华为·harmonyos·鸿蒙
白帽攻防录3 小时前
SRC 挖洞:Android 蓝牙预认证 RCE 深度复盘,CVE-2026-55330 怎么在蓝牙范围内零交互攻破手机
android·网络安全·智能手机·src漏洞挖掘
vilya3 小时前
手机端 Agent 是怎么跑起来的:决策循环、四道护栏、两条红线
android·agent