Flutter与Native通信-Android端

BasicMessageChannel 用法

Native端
BasicMessageChannel(@NonNull BinaryMessenger messenger, @NonNull String name, @NonNull MessageCodec<T> codec) 
  • BinaryMessenger messenger
    消息信使,是消息的发送与接收工具
  • String name
    Channel名字,唯一标识符
  • MessageCodec<T> codec
    消息的编解码器

setMessageHandler 方法原型

void setMessageHandler(BasicMessageChannel.MessageHandler<T> handler)
  • BasicMessageChannel.MessageHandler<T> handler
    消息处理器,配合BinaryMessager完成消息的处理。

在创建好BasicMessageChannel后,如果要让其接收来自Dart发来额消息,则需要调用它的setMessageHandler方法为其设置一个消息处理器。

BasicMessageChannel.MessageHandler 原型

public interface MessageHandler<T> {
	void onMessage(@Nullable T message, @NonNull Reply<T> reply);
 }
  • onMessage(@Nullable T message, @NonNull Reply<T> reply)
    用于接收消息,message 是消息内容,reply是回复此消息的回调函数。

send 方法原型

void send(@Nullable T message)
void send(@Nullable T message, @Nullable final Reply<T> callback)
  • T message
    要发送的消息
  • Reply<T> callback
    消息发出去后,收到Dart回复的消息函数

在创建好BasicMessageChannel后,如果要向Dart发送消息,可以调用它的send方法向Dart传递数据。

public class BasicMessageChannelPlugin implements BasicMessageChannel.MessageHandler<String> {

    private Activity activity;
    private BasicMessageChannel<String> messageChannel;

    public BasicMessageChannelPlugin(Activity activity, BinaryMessenger binaryMessenger) {
        this.activity = activity;
        messageChannel = new BasicMessageChannel<>(binaryMessenger, "channel", StringCodec.INSTANCE);
        // 设置消息处理器,处理来自Dart的消息
        messageChannel.setMessageHandler(this);
    }

    /**
     * 接收处理来自Dart的消息
     *
     * @param message
     * @param reply
     */
    @Override
    public void onMessage(@Nullable String message, @NonNull BasicMessageChannel.Reply<String> reply) {
        // 回复Dart端消息
        reply.reply("接收到来自Dart的消息:" + message);
        if (activity instanceof IShowMessage) {
            ((IShowMessage) activity).onShowMessage(message);
        }
        Toast.makeText(activity, message, Toast.LENGTH_SHORT).show();
    }

    /**
     * 向Dart传递消息,并接受Dart的反馈
     *
     * @param message
     * @param callback
     */
    void send(String message, BasicMessageChannel.Reply<String> callback) {
        messageChannel.send(message,callback);
    }
}

Dart端
static const BasicMessageChannel _basicMessageChannel =
      const BasicMessageChannel('channel', StringCodec());

  /// 设置setMessageHandler接收来自Native发来的消息,并回复Native
  void _receiveMessage() {
    _basicMessageChannel.setMessageHandler((message) => Future<String>(() {
          setState(() {
            showMessage = message;
          });
          return "收到Native消息${message}";
        }));
  }

  /// 调用send发送消息
  void _sendMessage(String message) async {
    String response;
    try {
      response = await _basicMessageChannel.send(message);
    } on PlatformException catch (e) {
      print(e);
    }
  }

MethodChannel用法

Native端

构造方法原型

MethodChannel(BinaryMessenger messenger, String name) 
MethodChannel(BinaryMessenger messenger, String name, MethodCodec codec)
  • BinaryMessenger messenger
    消息信使,是消息的发送和接收的工具
  • String name
    Channel的名字,也是其唯一标识符
  • MethodCodec codec
    用作 MethodChannel的编解码器

setMethodCallHandler 方法原型

void setMethodCallHandler(final @Nullable MethodCallHandler handler)
  • MethodCallHandler handler
    消息处理器,配合BinaryMessager完成消息的处理

在创建好MethodChannel后,需要调用它的setMethodCallHandler方法为其设置一个消息处理器,以便能接收来自Dart端消息。

MethodChannel.MethodCallHandler 原型

public interface MethodCallHandler {
	void onMethodCall(@NonNull MethodCall call, @NonNull Result result);
 }
  • onMethodCall(@NonNull MethodCall call, @NonNull Result result)
    用于接收消息,call 是消息内容,它有两个成员变量String类型的call.method表示调用的方法名,Object类型的call.arguments表示调用方法所传递的入参,MethodChannel.Result result 是回复此消息的回调函数提供了 result.successresult.errorresult.notImplemented方法调用。
public class MethodChannelPlugin implements MethodChannel.MethodCallHandler {

    private Activity activity;
    private MethodChannel methodChannel;

    public MethodChannelPlugin(Activity activity, BinaryMessenger binaryMessenger) {
        this.activity = activity;
        methodChannel = new MethodChannel(binaryMessenger, "channel");
        // 设置消息处理器,处理来自Dart的消息
        methodChannel.setMethodCallHandler(this);
    }

    /**
     * 向Dart传递消息,并接受Dart的反馈
     *
     * @param message
     * @param callback
     */
    void send(String message, BasicMessageChannel.Reply<String> callback) {
        methodChannel.invokeMethod(message, callback);
    }

    /**
     * 接收处理来自Dart的消息
     *
     * @param call
     * @param result
     */
    @Override
    public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
        switch (call.method) {
            case "showMessage":
                showMessage(call.arguments());
                break;
            default:
                result.notImplemented();
        }
    }

    /**
     * 显示从Dart端传递的消息
     *
     * @param arguments
     */
    private void showMessage(String arguments) {
        if (activity instanceof IShowMessage) {
            ((IShowMessage) activity).onShowMessage(arguments);
        }
    }
}

Dart端
static const MethodChannel _methodChannel = const MethodChannel('channel');
response = await _methodChannel.invokeMethod('send', 'value');

EventChannel 用法

Native端

构造方法原型

EventChannel(BinaryMessenger messenger, String name)
EventChannel(BinaryMessenger messenger, String name, MethodCodec codec) 
  • BinaryMessenger messenger
    消息信使,是消息发送和接收的工具
  • String name
    Channel的名字,唯一标识
  • MethodCodec codec
    用作EventChannel的编解码器

setStreamHandler 方法原型

void setStreamHandler(final StreamHandler handler)
  • StreamHandler handler
    消息处理器,配合BinaryMessager完成消息的处理,在创建好EventChannel后,如果要让其接收Dart发来的消息,则需要调用它的setStreamHandler 方法为其设置一个消息处理器。

StreamHandler 原型

public interface StreamHandler {
	void onListen(Object arguments, EventSink events);
	void onCancel(Object arguments);
}
  • void onListen(Object arguments, EventSink events)
    Flutter Native 监听事件时调用,Object arguments是传递的参数,EventSink events 是 Native 回调Dart时的回调函数,EventSink提供successerrorendOfStream 三个回调方法分别对应事件的不同状态。
  • void onCancel(Object arguments)
    Native 取消监听时调用
public class EventChannelPlugin implements EventChannel.StreamHandler {

    private List<EventChannel.EventSink> eventSinks = new ArrayList<>();


    static EventChannelPlugin registerWith(Activity activity, BinaryMessenger binaryMessenger) {
        EventChannelPlugin eventChannelPlugin = new EventChannelPlugin();
        new EventChannel(binaryMessenger, "channel")
                .setStreamHandler(eventChannelPlugin);
        return eventChannelPlugin;
    }

    /**
     * 向Dart传递消息,并接受Dart的反馈
     *
     * @param params
     */
    void sendEvent(Object params) {
        for (EventChannel.EventSink sink : eventSinks) {
            sink.success(params);
        }
    }


    @Override
    public void onListen(Object arguments, EventChannel.EventSink events) {
        eventSinks.add(events);
    }

    @Override
    public void onCancel(Object arguments) {

    }
}

扩展阅读

https://juejin.cn/post/6844903997866786829
https://juejin.cn/post/6844904190725062670

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Flutter 和 React Native 都是强大的框架,各有优缺点。Flutter 提供了快速开发和卓越的性能,但是它仅支持 Android 和 iOS,而且在某些情况下没有明显的好处。React Native 则支持多种平台,并且可以使用 JavaScript 和 React 来开发应用,但是它在性能上可能不如 Flutter 那么出色。 ### 回答2: Flutter 是一种由 Google 开发的跨平台应用开发框架,而 React Native 是由 Facebook 创建的另一种跨平台应用开发框架。它们都可以用于开发高性能的移动应用,但却有各自的优缺点。 首先,让我们来谈谈 Flutter 的优点。Flutter 使用 Dart 编程语言,它的一大优点是具有热重载功能,这意味着开发者可以快速地看到他们所做的更改的实时预览。这加快了开发速度并提高了生产力。另外,Flutter 的UI组件是自定义的,不依赖于平台原生组件,这意味着应用程序的外观和性能在不同平台上都是一致的。Flutter 还具有很好的性能,应用程序可以实现原生级别的用户体验。最后,Flutter 的文档和社区资源相对丰富,为开发者提供了很好的支持。 然而,Flutter 也有一些缺点。首先,Flutter 相对较新,相比于 React Native,它的生态系统和第三方库更少。其次,由于自定义UI组件,一些原生平台功能可能需要使用平台通道(Paltform Channel)来实现,这可能需要额外的开发工作。最后,Flutter 使用 Dart 语言,这意味着开发者需要学习一门新的语言,这可能对一些开发者来说是一个学习曲线。 接下来,我们来看看 React Native 的优点。首先,React Native 是基于 JavaScript 的,这使得很多前开发者可以很容易地上手。它还有一个强大的社区和生态系统,有很多第三方库和插件可供选择。第二,React Native 允许开发者使用原生代码,以提高性能和访问平台特有功能。这使得 React Native 适用于开发对原生平台特性有较高要求的应用程序。最后,React Native 有很好的跨平台性能,开发者可以同时为 Android 和 iOS 开发应用程序,这可以节省时间和资源。 然而,React Native 也有一些缺点。首先,应用程序的性能可能不如原生应用程序。虽然 React Native 为开发者提供了许多原生组件和API,但使用这些功能可能需要对底层原生代码的进一步了解。第二,由于使用 JavaScript,React Native 在一些复杂的应用程序中可能会遇到性能问题。最后,React Native 的文档和社区相对较好,但相较于 Flutter,信息不够丰富。 综上所述,Flutter 和 React Native 都有各自的优点和缺点。选择哪种框架取决于开发者的需求和资源。如果开发速度和性能是首要考虑因素,那么可以选择 Flutter。如果对原生特性的依赖度较高,并且有一支熟悉 JavaScript 的团队,那么 React Native 也是一个不错的选择。 ### 回答3: 一、Flutter的优点: 1. 高性能:Flutter使用自己的高性能渲染引擎Skia进行绘图操作,可以直接绘制UI界面,减少了与平台的交互,提高了性能表现。 2. 跨平台:Flutter可以同时在Android和iOS平台上运行,只需一份代码即可。开发者可以通过Flutter框架编写跨平台的应用,大大节省了开发时间和成本。 3. 热重载:Flutter支持热重载,修改代码后可以实时看到效果,提高了开发效率。 4. UI丰富:Flutter提供了丰富的UI组件,可以快速构建各种复杂的界面和动画效果。 5. 社区活跃:Flutter拥有庞大的开发者社区,文档和资源丰富,问题可以及时得到解决。 6. 学习曲线较低:Flutter使用Dart语言进行开发,语法简洁易学,对于有一定编程基础的开发者来说,上手相对容易。 二、Flutter的缺点: 1. 相对新生:相比于React NativeFlutter相对来说发展时间较短,生态环境相对较弱,一些功能和第三方库还在积极补充中。 2. 运行体积较大:由于Flutter自带了渲染引擎和一些基础组件,导致应用的安装包体积较大,对于初始下载和安装时间较长的应用来说,会对用户体验造成一定影响。 三、React Native的优点: 1. 生态丰富:React Native有较为完善的生态环境,因为React Native诞生更早,社区已经积累了多个成熟的第三方库和组件,可以快速引入使用,提高开发效率。 2. 稳定性较高:React Native经过多年发展已经相对较为稳定,出现的bug相对较少,更适合对稳定性要求较高的项目。 3. 社区活跃:React Native拥有庞大的开发者社区,问题可以及时得到解决。此外,社区提供的资源丰富,有很多优秀的教程、文章和开源项目供学习和借鉴。 四、React Native的缺点: 1. 性能问题:由于React Native是通过Bridge与原生代码进行通信,会造成一定的性能损耗。对于对性能要求较高的应用,可能需要进行一些优化。 2. 学习曲线相对陡峭:React Native使用JavaScript语言进行开发,相对于Flutter的Dart语言来说,学习曲线较陡峭,对于没有JavaScript基础的开发者可能更为困难。 3. 动画效果受限:相对于Flutter的自绘UI,React Native对于一些复杂的动画效果支持相对较弱,需要借助于原生代码进行实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值