简介

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和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)

打印成果如下:

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

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")

打印成果如下:

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

MethodChannel是Flutter和Android原生常用的通讯办法,不仅能够异步通讯,还能传递数据调集,Map等。通过界说不同的办法名,调用Android不同的功用。

总结

本文首要介绍Flutter与Android原生的三种通讯办法,能够根据实际开发中的事务,挑选适宜的通讯办法。熟练掌握三种通讯办法能够在Flutter开发中运用Android原生供给的功用。