likes
comments
collection
share

Flutter混合开发(三)通讯交互

作者站长头像
站长
· 阅读数 42

书接上文,这篇文章就来简单介绍一下flutter和原生的通讯交互,首先简单介绍下flutter定义的几个通道

  • BasicMessageChannel:传递字符串或半结构化信息;
  • MethodChannel:传递方法调用(method invocation);
  • EventChannel:数据流(event streams)通讯。

而这三个类的成员变量都是一致的

private final BinaryMessenger messenger;//用于发送二进制数据
private final String name;// channel 的名字,全局唯一
private final MethodCodec codec;//MessageCodec 或 MethodCodec 类型,消息的编码解码器
private final BinaryMessenger.TaskQueue taskQueue;//用来调用原生Handler

当我们初始化一个Channel,并向该Channel注册处理消息的Handler时,实际上会生成一个与之对应的BinaryMessageHandler,并以channel name为key,注册到BinaryMessenger中。当Flutter端发送消息到BinaryMessenger时,BinaryMessenger会根据其入参channel找到对应的BinaryMessageHandler,并交由其处理。

下面来简单实现下原生端代码


//flutterEngine在上篇文章实现过了,这里直接引用不粘贴了
new MethodChannel(new ShimPluginRegistry(flutterEngine).registrarFor("fengdongliuxiang").messenger(), "fengdongliuxiang").setMethodCallHandler(
        new MethodChannel.MethodCallHandler() {
            @Override
            public void onMethodCall(MethodCall call, MethodChannel.Result result) {
                if (call.method.equals("setText")) {
                    result.success("我真帅");
                    System.out.println("发送成功");
                } else {
                    result.notImplemented();
                }
            }
        }
);

接着来实现flutter端代码

String str = "Hello Flutter";
MethodChannel _channel = MethodChannel("fengdongliuxiang");

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("我是flutter"),
        leading: IconButton(
        onPressed: () {
            print(Navigator.defaultRouteName);
            SystemNavigator.pop();
          },
          icon: const Icon(Icons.chevron_left),
        ),
      ),
      body: Column(
        children: [
          Center(
            child: Text(str),
          ),
          TextButton(
              onPressed: () {
                print("设置文本");
                setText();
              },
              child: Text('设置文本'))
        ],
      ),
    );
  }

 Future setText() async {
    str = await _channel.invokeMethod("setText");
    setState(() {
      print(str);
    });
  }

运行效果如下

Flutter混合开发(三)通讯交互

除此之外,也可以用实现接口的方式来创建一个类,这种写法通常用在插件制作中

package com.example.nativetest;

import android.app.Activity;

import androidx.annotation.NonNull;

import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.PluginRegistry.Registrar;

public class FlutterPluginDemo implements FlutterPlugin, MethodCallHandler {
    private MethodChannel channel;
    private Activity activity;

    FlutterPluginDemo(Activity activity) {
        this.activity = activity;
    }


    public void registerWith(Registrar registrar) {
        channel = new MethodChannel(registrar.messenger(), "fengdongliuxiang");
        FlutterPluginDemo instance = new FlutterPluginDemo(registrar.activity());
        //setMethodCallHandler在此通道上接收方法调用的回调
        channel.setMethodCallHandler(instance);
    }

    @Override
    public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
        channel = new MethodChannel(binding.getFlutterEngine().getDartExecutor(), "fengdongliuxiang");
        channel.setMethodCallHandler(this);
    }

    @Override
    public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
        channel.setMethodCallHandler(null);
    }

    @Override
    public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
        if (call.method.equals("setText")) {
            result.success("我真帅");
            System.out.println("发送成功");
        }else {
            result.notImplemented();
        }
    }
}

调用如下

FlutterPluginDemo flutterPluginDemo=new FlutterPluginDemo(SecondPage.this);
ShimPluginRegistry shimPluginRegistry = new ShimPluginRegistry(flutterEngine);
flutterPluginDemo.registerWith(shimPluginRegistry.registrarFor("fengdongliuxiang"));

总结

以上就是简单的通讯交互了,实际开发中应用到的远不止于此,更多的用法就留在以后再讨论吧,下一篇文章应该会更新Android音视频笔记系列,如果各位觉得有帮助不妨点个赞,谢谢。

转载自:https://juejin.cn/post/7353208973880082482
评论
请登录