Flutter混合开发 MethodChannel单向传递消息
前言:
上一章中讲到了EventChannel是Android端给Flutter发送单向消息,是可持续发送的,本篇给大家介绍的是MethodChannel,是一次性通信,有返回值,常用与Flutter给Android端发送消息
先上效果:效果图(1.1)
分析
Android端:
- 只有一个按钮跳转到Flutter页面
- 使用Toast接收Flutter发送的消息
- 接收到Flutter端给的数据后返回一个数据,(可不返回)
Flutter端:
- 使用TextField()文本框输入文本的同时发送消息给Android
Android端
第一步:创建MethodChannel通道
MethodChannel channel = new MethodChannel(messenger, "MethodChannelPlugin");
- 参数一:BinaryMessenger messenger 发送消息工具
- 参数二:通道名字,必须和Flutter端通道名一致(必须和
效果图1.5
一致)
效果图(1.5)
第二步:通过channel.setMethodCallHandler(this);获取到Flutter端发送消息并返回
public class MethodChannelPlugin implements MethodCallHandler {
MethodChannel channel = new MethodChannel(messenger, "MethodChannelPlugin");
channel.setMethodCallHandler(this);
@Override
public void onMethodCall(MethodCall call, Result result) {
switch (call.method) {//处理来自Dart的方法调用
case "send":
showMessage(call.arguments());
result.success("MethodChannelPlugin收到:" + call.arguments);//返回结果给Dart
break;
default:
result.notImplemented();
}
}
}
通过重写方法onMethodCall()中的call参数call.method()来获取Flutter端发送过来的标识,和效果图(1.2)
对应效果图(1.2)
通过result.success()接收参数成功后返回一个值!
MethodChannelPlugin完整代码:
/**
* szj 2020/11/27
* CSDN博客:https://blog.csdn.net/weixin_44819566/
* 微信公众号:码上变有钱
* MethodChannelPlugin
* 用于传递方法调用(method invocation),一次性通信,通常用于Dart调用Native的方法:如拍照;
*/
public class MethodChannelPlugin implements MethodCallHandler {
private final Activity activity;
/**
* Plugin registration.
*/
public static void registerWith(BinaryMessenger messenger, Activity activity) {
MethodChannel channel = new MethodChannel(messenger, "MethodChannelPlugin");
MethodChannelPlugin instance = new MethodChannelPlugin(activity);
channel.setMethodCallHandler(instance);
}
private MethodChannelPlugin(Activity activity) {
this.activity = activity;
}
@Override
public void onMethodCall(MethodCall call, Result result) {
switch (call.method) {//处理来自Dart的方法调用
case "send":
showMessage(call.arguments());
result.success("MethodChannelPlugin收到:" + call.arguments);//返回结果给Dart
break;
default:
result.notImplemented();
}
}
/**
* 展示来自Dart的数据
*
* @param arguments
*/
private void showMessage(String arguments) {
if (activity instanceof IShowMessage) {
((IShowMessage) activity).onShowMessage(arguments);
}
Toast.makeText(activity, arguments, Toast.LENGTH_SHORT).show();
}
}
直接在FlutterAppActivity中注册即可;
不知道FlutterAppActivity是啥的请查看Flutter混合开发 BasicMessageChannel与原生android通信(4.3)
public class FlutterAppActivity extends FlutterActivity implements IShowMessage {
@Override
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
super.configureFlutterEngine(flutterEngine);
MethodChannelPlugin.registerWith(flutterEngine.getDartExecutor(),this);
}
}
Flutter端
第一步:对MethodChannel监听
MethodChannel _methodChannel = new MethodChannel("MethodChannelPlugin");
通道一定要和Android端对应(和效果图(1.6)
对应)效果图1.6
第二步:创建一个TextField并对输入文字监听
TextField(
onChanged: _onMethodChannelTextChange,
decoration: InputDecoration(
hintText: "使用MethodChannel给原生发送的消息",
),
),
Text("MethodChannel接收数据为:$_methodMessage")
void _onMethodChannelTextChange(String value) async {
var content = await _methodChannel.invokeMethod("send", value);
print("szjmethodChannel$content");
setState(() {
_methodMessage = content ?? "MethodMessage消息为空啦";
});
}
这里的send和Android对应的是效果图(1.3)
效果图(1.3)
相当于通过一个标识来传递的数据
var content = await _methodChannel.invokeMethod(“send”, value);
他的返回值就是Android给返回的数据,这里和效果图(1.4)
对应
效果图(1.4)
走到这里Flutter端的代码就完成啦
在来看看最终效果吧:
最终效果图:
猜你喜欢:
FLutter混合开发 Android跳转Flutter页面,Flutter引擎等(4.1)
Flutter混合开发 传递初始化数据给Android(4.2)
Flutter混合开发 BasicMessageChannel与原生android通信(4.3)
Flutter混合开发 EventChannel单向传递数据(4.4)
Flutter混合开发 如何将Flutter项目变成Module导入Android项目(4.6)
原创不易,您的点赞就是对我最大的支持,留下您的点赞吧~
本文地址:https://blog.csdn.net/weixin_44819566/article/details/110235518
上一篇: ANR