Flutter和Android原生通信的三种方式

简介

Flutter虽然有强大的跨平台能力,但是其跨平台主要体现在UI界框架上,对于一些Android原生的功能如:获取电池电量,访问手机蓝牙,定位等硬件信息显得有些不足心。还是需要调用Android原生方法获取。所以使用Flutter和Android原生通信的方式是必不可少的。 本文正在参加「金石计划」

本文主要介绍Flutter与Android原生三种通信方式的用法。

1.BasicMessageChannel

定义

双向通信,,有返回值,主要用于传递字符串和半结构化的信息。

基本使用

1)Flutter端

  1. 创建BasicMessageChannel对象并定义channel的name,必须和Android一端保持一致。
 late BasicMessageChannel<String> _messageChannel;
 _messageChannel = const BasicMessageChannel<String>("baseMessageChannel",
        StringCodec());
  1. 设置setMessageHandler监听Android原生发送的消息。
_messageChannel.setMessageHandler((message) async {
  print("flutter :Message form Android reply:$message");
  return "flutter already received reply ";
});
  1. 发送消息给Android原生。
 _messageChannel.send("Hello Android,I come form Flutter");

2)Android端

  1. 初始化BasicMessageChannel,定义Channel名称。
val messageChannel = BasicMessageChannel<String>(
    flutterEngine.dartExecutor.binaryMessenger,
     "baseMessageChannel",StringCodec.INSTANCE)
  1. 设置setMessageHandler监听来自Flutter的消息。
 messageChannel.setMessageHandler { message, reply ->
            Log.i("flutter", "android receive message form flutter :$message")

        }
  1. 主动发送消息给Flutter。
  messageChannel.send("flutter")

打印结果如下:

从用法上来看,Flutter和Android原生基本上是一样的,只不过是不同语言的不同写法。Flutter端主动调用send方法将消息传递给Android原生。然后打印log日志。

2.EventChannel

定义

基本使用

单向通信,是一种Android native向Flutter发送数据的单向通信方式,Flutter无法返回任何数据给Android native。主要用于Android native向Flutter发送手机电量变化、网络连接变化、陀螺仪、传感器等信息,主要用于数据流的通信

1)Flutter端

  1. 创建EventChannel对象,并给定channel名称。
late EventChannel _eventChannel;
 _eventChannel = const EventChannel("eventChannel");
  1. 使用receiveBroadcastStream接收Android端的消息。
 _eventChannel.receiveBroadcastStream().listen( (event){
      print("Flutter:Flutter receive from Android:$event");
    },onDone: (){
      print("完成");
    },onError: (error){
      print("失败:$error");
    });

2)Android端

  1. 创建EventChannel对象,并定义channel的name。
 val eventChannel  = EventChannel(flutterEngine.dartExecutor.binaryMessenger,"eventChannel")
  1. 设置setStreamHandler监听。
  eventChannel.setStreamHandler(object :StreamHandler{
            override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {
                eventSink = events
            }

            override fun onCancel(arguments: Any?) {
            }


        })
  1. 发送消息给Flutter端。
 Handler(mainLooper).postDelayed({
                    Log.i("flutter", "android send message")
                    eventSink?.success("Hello Flutter")
                },500)

打印结果如下:

EventChannel是单向通信,并且只能从Android原生端发送消息给Flutter,Flutter不可以主动发消息,使用有局限性。

3.MethodChannel

定义

双向异步通信,Flutter和原生端都可以主动发起,同时可以互相传递数据,用于传递方法调用。

基本使用

1)Flutter

  1. 创建MethodChannel对象,并定义通道名称。
 late MethodChannel _methodChannel;
 _methodChannel = const MethodChannel('methodChannel');
  1. 设置setMethodCallHandler异步监听消息。
 _methodChannel.setMethodCallHandler((call) async {

    });
  1. 调用invokeMethod方法发送消息给Android,并接收返回值。
  var map = {'name':'小明','age':18};
   String result  = await _methodChannel.invokeMethod('openMethodChannel',map);
   print("Flutter接收Android返回的结果:$result");

2)Android端

  1. 创建MethodChannel对象,并定义通道名称。
 val methodChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger,"methodChannel")
  1. 设置setMethodCallHandler监听Flutter消息,并通过MethodCall.method区分方法名。
methodChannel.setMethodCallHandler { call, result ->
    if (call.method == "openMethodChannel"){
        val  name = call.argument<String>("name")
        val age = call.argument<Int>("age")
        Log.i("flutter", "android receive form:$name ,$age ")
        result.success("success")
    }


}
  1. 发送消息给Flutter。
  messageChannel.send("Hello Flutter")

打印结果如下:

MethodChannel是Flutter和Android原生常用的通信方式,不仅可以异步通信,还能传递数据集合,Map等。通过定义不同的方法名,调用Android不同的功能。

总结

本文主要介绍Flutter与Android原生的三种通信方式,可以根据实际开发中的业务,选择合适的通信方式。熟练掌握三种通信方式可以在Flutter开发中使用Android原生提供的功能。

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYPkN0xH' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片