Flutter混合开发(三):Android与Flutter之间通信详细指南

  • MethodChannel:用于传递方法调用,一次性通信。通常用于Dart调用Native的方法。

  • EventChannel:用于数据流的通信,持续通信,收到消息后无法回复此次消息。通常用于Native向Dart的通信。

下面我们就来看看这三种Channel通信方式的具体使用和介绍。

BasicMessageChannel

======================================================================================

Android端的相关方法:

BasicMessageChannel(BinaryMessenger messenger, String name, MessageCodec codec)

  • messenger参数是消息信使(FlutterView),是消息发送和接受的工具。

  • name参数是channel的名字也是其唯一标识,要和Dart端统一。

  • codec是消息编解码器,也需要和Dart端统一。它的作用就是将消息在发送的时候进行加密,dart端收到消息后在进行解密,传递的都是二进制数据。它有四种类型:BinaryCodec、StringCodec、JSONMessageCodec、StandardMessageCodec,四种类型均属于MessageCodec范畴。如不指定默认是StandardMessageCodec。

当我们需要接受来自Dart端发送的消息时使用setMessageHandler方法:

void setMessageHandler(BasicMessageChannel.MessageHandler handler)

参数handler是消息处理器,配合BinaryMessenger来完成对消息的处理。它是一个接口,具体的实现在onMessage方法中:

public interface MessageHandler {

void onMessage(T message, BasicMessageChannel.Reply reply);

}

参数message即为Dart发送的数据, reply是用于回复消息的回调函数,提供reply.reply(“”)设置回复的内容。

上面讲的是接受Dart端的消息,那么Native端主动发送消息则是使用send方法,它有两个重载方法:

void send(T message)

void send(T message, BasicMessageChannel.Reply callback)

参数message即为要发生给Dart的数据,callback回调则是用于接收Dart端收到消息后的回复信息。

Dart端相关方法:

const BasicMessageChannel(this.name, this.codec);

这里的name和codec和Android端的构造方法参数是一样的,那么是channel的名字也是唯一标识,codec是消息编解码器,两个参数在两端必须统一。

Dart端如果要接受Native端的消息则要设置setMessageHandler方法:

void setMessageHandler(Future handler(T message))

参数handler为消息处理器,配合BinaryMessenger来完成对消息的处理。

通过send方法向Native端发送消息:

Future send(T message)

参数message为要传递的参数。Future为发送消息后等待Native回复的回调函数。

BasicMessageChannel实战:Android端和Flutter端相互发送消息,并且在收到消息后返回对方信息
Android端代码:

//初始化BasicMessageChannel

BasicMessageChannel basicMessageChannel = new BasicMessageChannel<>(flutterView,

“BasicMessageChannelPlugin”,StringCodec.INSTANCE);

//接受消息

basicMessageChannel.setMessageHandler((message, reply) -> {

mTvDart.setText(message);

reply.reply(“收到dart数据:接受成功”);

});

//发送消息

basicMessageChannel.send(message, reply -> mTvDart.setText(reply));

Dart端代码:

//初始化BasicMessageChannel

static const BasicMessageChannel _basicMessageChannel =

BasicMessageChannel(“BasicMessageChannelPlugin”, StringCodec());

// 接受消息

void handleBasicMessageChannel() {

_basicMessageChannel

.setMessageHandler((String message) => Future(() {

setState(() {

showMessage = message;

});

return “收到Native的消息:接受成功”;

}));

}

//发送消息

response = await _basicMessageChannel.send(_controller.text);

setState(() {

showMessage = response;

});

最后效果为下图,红色分割线上部分为Native页面,下部分为Flutter页面。

MethodChannel

================================================================================

使用MethodChannel相关方法的参数类型及含义和BasicMessageChannel的参数含义都是相同的,下面就不一一解释了。

Androd端相关方法:

MethodChannel(BinaryMessenger messenger, String name)

MethodChannel(BinaryMessenger messenger, String name, MethodCodec codec)

第一个构造函数会构造一个StandardMethodCodec.INSTANCE类型的MethodCodec。MethodCodec定义了两种类型:JSONMethodCodec和StandardMethodCodec。

如果想接受来自Dart端的消息则使用:

setMethodCallHandler(@Nullable MethodChannel.MethodCallHandler handler)

MethodCallHandler为接口,回调方法为:

public interface MethodCallHandler {

void onMethodCall(MethodCall call, MethodChannel.Result result);

}

call参数有两个成员变量,String类型的call.method表示调用的方法名,Object类型的call.arguments表示调用方法所传递的入参。result是回复此消息的回调函数提供了result.success,result.error,result.notImplemented方法调用。

发送消息主动调用Dart代码则使用invokeMethod方法

invokeMethod(@NonNull String method, @Nullable Object arguments)

invokeMethod(String method, @Nullable Object arguments, Result callback)

第二个方法多了一个callback,它是用来接受Dart端收到消息后的回复信息。

public interface Result {

void success(@Nullable Object result);

void error(String errorCode, @Nullable String errorMessage, @Nullable Object errorDetails);

void notImplemented();

}

Dart端相关方法:

const MethodChannel(this.name, [this.codec = const StandardMethodCodec()])

构造函数默认是使用StandardMethodCodec编解码器。

通过setMethodCallHandler方法接受来自Native的方法调用,通过invokeMethod方法调用Native端的方法。

void setMethodCallHandler(Future handler(MethodCall call))

Future invokeMethod(String method, [ dynamic arguments ])

MethodChannel实战: Native端调用Dart端的getPlatform方法返回当前的os平台,Dart端调用Native端的getBatteryLevel方法获取当前手机电量。
Android端代码:

//初始化MethodChannel

MethodChannel methodChannel = new MethodChannel(flutterView, “MethodChannelPlugin”);

mBtnTitle.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

//调用dart端getPlatform方法

methodChannel.invokeMethod(“getPlatform”, null, new MethodChannel.Result() {

@Override

public void success(@Nullable Object result) {

mTvDart.setText(result.toString());

}

@Override

public void error(String errorCode, @Nullable String errorMessage, @Nullable Object errorDetails) {

mTvDart.setText(errorCode + “==” + errorMessage);

}

@Override

public void notImplemented() {

mTvDart.setText(“未实现getPlatform方法”);

}

});

}

});

//接受dart的调用

methodChannel.setMethodCallHandler((call, result) -> {

switch (call.method) {

case “getBatteryLevel”:

int batteryLevel = getBatteryLevel();

if (batteryLevel != -1) {

result.success(“电量为:” + batteryLevel);

} else {

result.error(“1001”, “调用错误”, null);

}

break;

default:

result.notImplemented();

break;

}

});

Dart端代码:

// receive

void handleMethodChannelReceive() {

Future platformCallHandler(MethodCall call) async {

switch (call.method) {

case “getPlatform”:

return getPlatformName(); //调用success方法

// return PlatformException(code: ‘1002’,message: “出现异常”); //调用error

break;

}

}

_methodChannel.setMethodCallHandler(platformCallHandler);

// _methodChannel.setMethodCallHandler(null); //调用notImplemented

}

//send

void handleMethodChannelSend() async {

try {

response = await _methodChannel.invokeMethod(“getBatteryLevel”);

print(response);

setState(() {

showMessage = response;

});

} catch (e) {

最后笔者收集整理了一份Flutter高级入门进阶资料PDF

以下是资料目录和内容部分截图



里面包括详细的知识点讲解分析,带你一个星期入门Flutter。还有130个进阶学习项目实战视频教程,让你秒变大前端。

CallHandler(null); //调用notImplemented

}

//send

void handleMethodChannelSend() async {

try {

response = await _methodChannel.invokeMethod(“getBatteryLevel”);

print(response);

setState(() {

showMessage = response;

});

} catch (e) {

最后笔者收集整理了一份Flutter高级入门进阶资料PDF

以下是资料目录和内容部分截图

[外链图片转存中…(img-Tl5zKweH-1719817348654)]
[外链图片转存中…(img-P0WVIp6w-1719817348655)]
里面包括详细的知识点讲解分析,带你一个星期入门Flutter。还有130个进阶学习项目实战视频教程,让你秒变大前端。

[外链图片转存中…(img-hzaY7Pev-1719817348655)]

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值