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 地址

https://gitee.com/wangzy2018/flutter-android-combine.git

相关推荐
Estar.Lee1 小时前
时间操作[计算时间差]免费API接口教程
android·网络·后端·网络协议·tcp/ip
找藉口是失败者的习惯2 小时前
从传统到未来:Android XML布局 与 Jetpack Compose的全面对比
android·xml
Jinkey3 小时前
FlutterBasic - GetBuilder、Obx、GetX<Controller>、GetxController 有啥区别
android·flutter·ios
大白要努力!5 小时前
Android opencv使用Core.hconcat 进行图像拼接
android·opencv
天空中的野鸟6 小时前
Android音频采集
android·音视频
小白也想学C7 小时前
Android 功耗分析(底层篇)
android·功耗
曙曙学编程7 小时前
初级数据结构——树
android·java·数据结构
Summer不秃7 小时前
Flutter之使用mqtt进行连接和信息传输的使用案例
前端·flutter
旭日猎鹰7 小时前
Flutter踩坑记录(二)-- GestureDetector+Expanded点击无效果
前端·javascript·flutter
sunly_7 小时前
Flutter:AnimatedSwitcher当子元素改变时,触发动画
flutter