参数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相关方法的参数类型及含义和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) {
//捕获error和notImplemented异常
setState(() {
showMessage = e.message;
});
}
}
当我们在使用setMethodCallHandler接受到native的消息时,直接调用相关方法即可调用Native端的success回调。
如果直接抛异常如PlatformException,那么就调用Native端的error回调。
PlatformException(code: ‘1002’,message: “出现异常”)
如果我们直接设置handler为null
_methodChannel.setMethodCallHandler(null);
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://img-blog.csdnimg.cn/img_convert/8a2f62bbe4465d143d361516a00ca7c7.jpeg)
题外话
不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊
这里我为大家准备了一些我工作以来以及参与过的大大小小的面试收集总结出来的一套进阶学习的视频及面试专题资料包,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家~
欢迎评论区讨论。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://img-blog.csdnimg.cn/img_convert/8a2f62bbe4465d143d361516a00ca7c7.jpeg)
题外话
不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊
这里我为大家准备了一些我工作以来以及参与过的大大小小的面试收集总结出来的一套进阶学习的视频及面试专题资料包,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家~
[外链图片转存中…(img-EiHHmQGx-1711856974968)]
欢迎评论区讨论。