欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Flutter混合开发 MethodChannel单向传递消息

程序员文章站 2022-06-24 10:06:11
Flutter混合开发之MethodMessage单向传递消息分析Android端Flutter端前言:上一章中讲到了EventChannel是Android端给Flutter发送单向消息,是可持续发送的,本篇给大家介绍的是MethodChannel,是一次性通信,有返回值,常用与Flutter给Android端发送消息先上效果:效果图(1.1)分析Android端:只有一个按钮跳转到Flutter页面使用Toast接收Flutter发送的消息接收到Flutter端给的数据后返回一...

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

前言:
上一章中讲到了EventChannel是Android端给Flutter发送单向消息,是可持续发送的,本篇给大家介绍的是MethodChannel,是一次性通信,有返回值,常用与Flutter给Android端发送消息

先上效果:
效果图(1.1)
Flutter混合开发 MethodChannel单向传递消息

分析

Android端:

  • 只有一个按钮跳转到Flutter页面
  • 使用Toast接收Flutter发送的消息
  • 接收到Flutter端给的数据后返回一个数据,(可不返回)

Flutter端:

  • 使用TextField()文本框输入文本的同时发送消息给Android

Android端

第一步:创建MethodChannel通道

 MethodChannel channel = new MethodChannel(messenger, "MethodChannelPlugin");
  • 参数一:BinaryMessenger messenger 发送消息工具
  • 参数二:通道名字,必须和Flutter端通道名一致(必须和效果图1.5一致)

效果图(1.5)
Flutter混合开发 MethodChannel单向传递消息

第二步:通过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)
Flutter混合开发 MethodChannel单向传递消息
通过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
Flutter混合开发 MethodChannel单向传递消息

第二步:创建一个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)
Flutter混合开发 MethodChannel单向传递消息
相当于通过一个标识来传递的数据

var content = await _methodChannel.invokeMethod(“send”, value);

他的返回值就是Android给返回的数据,这里和效果图(1.4)对应

效果图(1.4)
Flutter混合开发 MethodChannel单向传递消息
走到这里Flutter端的代码就完成啦

在来看看最终效果吧:

最终效果图:

Flutter混合开发 MethodChannel单向传递消息

完整代码

猜你喜欢:

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)

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

Flutter混合开发 MethodChannel单向传递消息

本文地址:https://blog.csdn.net/weixin_44819566/article/details/110235518