Flutter学习-Platform Channel的使用

本文深入探讨了Flutter与原生平台间的三种通信渠道:MethodChannel、EventChannel和BasicMessageChannel的使用方法。MethodChannel适用于方法调用,EventChannel用于流数据传递,BasicMessageChannel则用于字符串和半结构化信息的传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

上一篇已经详细说明了Flutter和平台间交互的channel类型、参数等,现在来看一下实际怎么使用?

二、MethodChannel的使用

适应于Flutter端和本地之间方法的相互调用。即Flutter端可以调用本地方法,本地端也可以调用Flutter端的方法。
如Flutter端可以调用本地方法过程如下:
Flutter调用一个本地的方法,本地方法执行,最终以一个错误或者信息为响应。这种方法调用可以获取当前电池的状态、网络状态信息或者温度数据。一旦本地方法做出相应,就不会再发送任何的信息,直到下次方法调用。
反过来,本地也可以同样的调用Flutter端的方法。
应用场景:
比如Flutter端获取系统版本号等信息,建议使用该MethodChannel进行获取。下面演示下示例(相互调用):

Android端代码:
在Activity中创建MethodChannel,设置MethodCallHandler(用于处理Flutter端调用的方法等),再MethodCallHandler中接收Flutter端的调用方法(如getPlatformVersion),并返回result。如果不需要返回,可以不写result。
同样的,可以主动执行invokeMethod方法,调用Flutter端的方法。

    final MethodChannel channel = new MethodChannel(registrar.messenger(), "flutter_plugin_test");
    channel.setMethodCallHandler(new MethodCallHandler() {
      @Override
      public void onMethodCall(MethodCall methodCall, Result result) {
      //1.接收Flutter端的调用
        if (methodCall.method.equals("getPlatformVersion")) {
          result.success("Android " + android.os.Build.VERSION.RELEASE);
        } else {
          result.notImplemented();
        }
      }
    });
  //2.调用Flutter端方法
      channel.invokeMethod("getName", null);

Flutter端:
创建对应的MethodChannel ,名称同Android端。通过invokeMethod调用本地方法(如下:getPlatformVersion)。
同样的,可以setMethodCallHandler,进行平台端的方法调用(如下:getName)。
值得注意的是:
flutter 中的 methodHandler 接收到方法调用,再做相关处理。与 flutter 调用原生不一样,原生调用 fultter 方法是没有返回值的。


  static const MethodChannel _channel =
      const MethodChannel('flutter_plugin_test');

  static Future<String> get platformVersion async {
  //调用本地方法getPlatformVersion
    final String version = await _channel.invokeMethod('getPlatformVersion');
    return version;
  }
  static void init() {
    Future<dynamic> handlerMethod(MethodCall call) async {
      switch (call.method) {
        case "getName":
              print("getName in xxx");
          break;
      }
      _channel.setMethodCallHandler(handlerMethod);
    }
  }
  }

三、EventChannel的使用

上面的MethodChannel,主要是方法的调用。而EventChannel主要是流数据传递。可以互相主动通知。即本地和flutter可以互相进行数据传递。
Android端代码:
在Activity中创建EventChannel,设置setStreamHandler(用于监听Flutter端的状态),再StreamHandler中监听。 onListen是当flutter端建立channel,并开始监听本地事件时候的回调;
onCancel是当Flutter端取消监听时候的回调。

  EventChannel channel2 = new EventChannel(registrar.messenger(), "flutter_event_plugin");
   channel2.setStreamHandler(new EventChannel.StreamHandler() {
      @java.lang.Override
      public void onListen(java.lang.Object o, EventChannel.EventSink eventSink) { //flutter调用平台事件
          eventSink.success("Flutter监听成功");
      }
            @java.lang.Override
      public void onCancel(java.lang.Object o) {
          Log.i("EventChannel", "Flutter取消监听.");

      }
    });

Flutter端代码
创建对应的channel,通过receiveBroadcastStream开始监听本地的事件。event为平台端发送过来的数据。(示例里面就是Flutter监听成功的字符数据)。

  void initEventChannel() {
  EventChannel('flutter_event_plugin').receiveBroadcastStream().listen((event) {
        print("收到本地消息 receiveBroadcastStream $event");
  });
  }

四、BasicMessageChannel的使用

BasicMessageChannel用于传递字符串和半结构化的信息的传递,可以实现互相通信。
Android端:
在Activity中创建BasicMessageChannel ,设置setMessageHandler(用于监听Flutter端的消息)。
可以通过send,发送消息到Flutter端。参数是一个对象即可。

      BasicMessageChannel channel1 = new BasicMessageChannel(registrar.messenger(), "flutter_message_plugin", StringCodec.INSTANCE );
    channel1.setMessageHandler(new BasicMessageChannel.MessageHandler() {
      @java.lang.Override
      public void onMessage(java.lang.Object object, BasicMessageChannel.Reply reply) {  //flutter发送消息到平台测
        Log.i("BasicMessageChannel", "接收到Flutter的消息:" + object);
      }
    });
    channel1.send("发送消息到Flutter");

Flutter端:
创建对应的channel,通过setMessageHandler开始监听本地的事件。同时,可以通过send,发送消息到本地端。

  BasicMessageChannel channel = BasicMessageChannel<String>('flutter_message_plugin', StringCodec());
  channel.setMessageHandler((message) {
       print("接收到来自Native的消息");

  });
  channel.send("发送消息到Native");
  }

五、总结

本文对Flutter和Native之间互相通信使用举例了一些。但是其使用还是要自己去看看源代码。这个只是粗略的概述。

### Flutter 插件加载器开发文档及相关解决方案 Flutter 的插件机制允许开发者通过 Dart 和原生平台(Android/iOS)之间的通信实现功能扩展。以下是关于 Flutter 插件加载器的相关开发文档和常见问题解决方法: #### 1. 官方插件架构概述 Flutter 提供了一种基于 MethodChannelPlatform Channel 的方式来支持跨平台调用[^1]。官方文档中提到,Dart 层面的插件注册可以通过 `GeneratedPluginRegistrant` 类完成自动初始化过程。此类会在应用启动时动态加载所有已声明的插件。 对于自定义插件加载逻辑的需求,可以参考以下代码片段展示如何手动管理插件实例化的过程: ```dart import 'package:flutter/services.dart'; void initializePlugins() { const platform = MethodChannel('com.example.custom_plugin'); try { final result = await platform.invokeMethod('initialize'); print("Custom Plugin Initialized: $result"); } on PlatformException catch (e) { print("Failed to Initialize Custom Plugin: ${e.message}"); } } ``` #### 2. 动态加载插件的技术细节 当项目规模增大或者需要按需加载某些模块时,可能需要用到动态加载技术。这通常涉及将插件拆分为独立组件并延迟其初始化时间点。一种常见的做法是在 Android 中利用 Gradle 配置分离 APK 资源文件,在 iOS 上则采用 CocoaPods 子规格的方式分别打包不同部分的功能库[^2]。 具体操作指南可查阅 Google 开发者博客文章《Building Modular Applications with Flutter》以及 Medium 平台上的社区分享案例研究。 #### 3. 常见错误排查建议 如果遇到插件无法正常工作的情况,请按照如下步骤逐一验证环境配置是否正确无误: - 确认 pubspec.yaml 文件内的依赖项版本号匹配当前工程需求; - 清理构建缓存并通过命令行重新同步依赖关系:`flutter clean && flutter pub get`; - 如果仍然存在问题,则尝试升级至最新稳定版 SDK 或切换分支测试兼容性表现[^3]. ```bash # 更新到最新的Flutter版本 flutter upgrade ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值