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

相关推荐
SoaringHeart1 小时前
Flutter最佳实践:键盘辅助视图输入框天添加图片附件
前端·flutter
心中有国也有家2 小时前
AtomGit Flutter 鸿蒙客户端:Canvas 绘制进阶-路径、渐变与混合模式
android·javascript·flutter·华为·harmonyos
hunterandroid3 小时前
WorkManager 可靠性实战:唯一任务、重试与幂等设计
android·前端
程序员老刘4 小时前
Android 17的10个AI功能,国内用户真正能用的有几个?
android·flutter·ai编程
花开彼岸天~5 小时前
鸿蒙应用开发实战【94】— 实战多卡号场景管理最佳实践
android·华为·harmonyos·鸿蒙系统
用户41659673693555 小时前
视频源文件音频轨异常分析记录
android
我命由我123456 小时前
集成 mupdf-android 的示例做为模块使用报错,程序包android.support.v4.view不存在
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
浮洋7 小时前
HabitGo:一个 Flutter 习惯追踪 App 的深度技术剖析
flutter
西西学代码8 小时前
Flutter---RefreshIndicator案例
flutter
雨白8 小时前
嵌套 ScrollView 滑动冲突实战:实现内部优先滚动
android