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

2 阅读2分钟

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

1.MethodChannel

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

2.BasicMessageChannel

用于Flutter Native双向流式通信

3.EventChannel

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

二、快速示例

1.MethodChannel 基本用法

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

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

//第一步:创建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端


//第一步:创建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端


//第一步:初始化(在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 端



///第一步 初始化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端


//第一步:初始化(建议放在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/…