Flutter-01-混合开发

107 阅读1分钟

Flutter-Native消息通道

  • BasicMessageChannel:用于传递字符串和半结构化的消息
  • EventChannel:用于数据流(event streams)的通信
  • MethodChannel:用于传递方法调用(method invocation)

一、BasicMessageChannel

Flutter端:

1,创建BasicMessageChannel:

String? _message = '';
static const _channel = BasicMessageChannel("messageChannel", StringCodec());

2,写一个接收函数,返回一个值

@override
void initState() {
  super.initState();

  //通过BasicMessageChannel实例,注册一个接收回调,并且返回信息。
  _channel.setMessageHandler((message) async{
    print("receive message: $message");
    setState(() {
      _message = message;
    });
    return 'ACK from dart';
  });
}

3,发送

Future<void> _sendMessage() async{
    String? message = await _channel.send("Hello from dart");
    print("Send message: $message");
  }

Android端:

class MainActivity: FlutterActivity() {
    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        //1. 初始化BasicMessageChannel,并传入名称,名称需要和dart内完全一致
        var channel = BasicMessageChannel(flutterEngine.dartExecutor.binaryMessenger,"messageChannel",StringCodec.INSTANCE)
        //2. 通过BasicMessageChannel实例注册接收回调,并且返回ACK
        channel.setMessageHandler { message, reply ->
            Log.d("flutter","Android receive message:$message")
            reply.reply("ACK from Android")
            Handler(Looper.getMainLooper()).postDelayed({
                //3. 通过BasicMessageChannel实例发送消息给dart
                channel.send("Hello from Android")
            },1000)
        }
    }
}

二、EventChannel

Flutter端:

1、创建一个EventChannel实例,传入通道名称,名称需要和Native侧完全一致

static const _channel = EventChannel("eventChannel");

2、通过EventChannel实例,注册一个接收回调,并且返回消息

@override
void initState() {
  super.initState();
  _channel.receiveBroadcastStream().listen((event){
     print("receive:$event");
     setState({
         _message = event;
     });
  },onError:(error){
      print("receive error:$error");
  },cancelError: true);
}

Android端:

//1. 初始化EventChannel,并传入名称,名称需要和dart内完全一致
val channel  = EventChannel(flutterEngine.dartExecutor.binaryMessenger,"eventChannel")

//2. 设置事件流的Handler
channel.setStreamHandler(object:EventChannel.StreamHandler{
    override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {
        eventSink = events
        Log.d("flutter","EventChannel onListened")
        Handler(Looper.getMainLooper()).postDelayed({
            Log.d("flutter","send ACK from Android")
            eventSink?.success("ACK from Android")
        },1000)
    }

    override fun onCancel(arguments: Any?) {
        Log.d("flutter","EventChannel onCanceled")
    }
})

三、方法通道

image.png

1、Flutter端

//1. 创建一个MethodChannel实例,传入通道名称,名称需要和Native完全一致
static const _channel = MethodChannel("methodChannel");

@override
void initState() async{
  super.initState();

  final Map<String,dynamic> map = {
    'name':'flutter',
    'version':'3.0.1',
    'android_api':31
  };
  String result = await _channel.invokeMethod("getFlutterInfo",map);
  print("Method invoke result: $result")
}

2、Android端

//1. 初始化MethodChannel,并传入名称,名称需要和dart内完全一致
val channel  = MethodChannel(flutterEngine.dartExecutor.binaryMessenger,"methodChannel")
//2. 注册MethodChannel处理器
channel.setMethodCallHandler { call, result ->
    if(call.method == "getFlutterInfo"){
        val name = call.argument<String>("name")
        val version = call.argument<String>("version")
    }
}