Flutter混合开发 MethodChannel双向传递消息(4.5)

Flutter混合开发之MethodMessage双向传递消息

上帝是不公平的,于是便有了世间的穷和富、善与恶、美与丑、成功与失败、幸福与不幸。上帝又是公平的,它给了你金钱,往往就要夺走你的真诚和善良;它给了你成熟,往往就要夺走你的青春和纯真;它给了你美貌,往往就要夺走你的智慧和毅力;它给了你成功,往往就要夺走你的健康和幸福。

前言:
上一章中讲到了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)

原创不易,您的点赞就是对我最大的支持,留下您的点赞吧~

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

s10g

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值