Flutter-使用MethodChannel 实现与iOS交互

前言

使用 MethodChannel 在 Flutter 与原生 Android 和 iOS 之间进行通信,可以让你在 Flutter 应用中调用设备的原生功能。

基础概念

  • MethodChannel:Flutter 提供的通信机制,允许消息以方法调用的形式在 Flutter 与原生代码之间传递。
  • 方法调用:从 Flutter 向原生或从原生向 Flutter 发送一个方法名和参数,接收方执行相应操作后,可以返回结果。

在 Flutter 中的实现

定义 MethodChannel
首先,在 Flutter 中定义一个 MethodChannel,传入一个与原生端约定的通道名称。

   import 'package:flutter/services.dart';

   class NativeBridge {
     static const MethodChannel _channel = MethodChannel('com.example.myapp/channel');
   
     static Future<String?> getPlatformVersion() async {
       final String? version = await _channel.invokeMethod('getPlatformVersion');
       return version;
     }
   }

调用方法
使用 _channel.invokeMethod 方法调用原生方法。传入方法名(与原生端约定)及需要的参数。
调用示例:
在这里插入图片描述

在 iOS 上的实现(Swift)

在 iOS 项目中设置 MethodChannel
在 AppDelegate.swift 中设置 MethodChannel

import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  private let CHANNEL = "com.example.myapp/channel"

  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    
    // 获取根视图控制器
    guard let controller = window?.rootViewController as? FlutterViewController else {
      fatalError("Root view controller is not a FlutterViewController")
    }
   // 创建方法通道
    let methodChannel = FlutterMethodChannel(name: CHANNEL, binaryMessenger: controller.binaryMessenger)
    methodChannel.setMethodCallHandler { (call: FlutterMethodCall, result: @escaping FlutterResult) in
      
      // 处理定义的方法
      if call.method == "getPlatformVersion" {
        result("iOS" + UIDevice.current.systemVersion)
      } else {
        result(FlutterMethodNotImplemented)
      }
    }
    
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

运行iOS设备查看效果
可以看到我们通过getPlatformVersion 成功获取到了系统版本号
在这里插入图片描述

封装通信管理类

NativeChannelManager

import 'package:flutter/services.dart';

/// NativeChannelManager 类是单例模式,用于与原生代码进行通信。
class NativeChannelManager {
  // 私有构造函数确保类的单例性
  NativeChannelManager._();

  // 单例对象
  static final NativeChannelManager _instance = NativeChannelManager._();

  // 提供一个访问单例的方法
  static NativeChannelManager get instance => _instance;

  // MethodChannel 实例
  final MethodChannel _channel = const MethodChannel('com.example.myapp/channel');

  // 获取平台版本
  Future<String?> getPlatformVersion() async {
    try {
      final String? version = await _channel.invokeMethod('getPlatformVersion');
      return version;
    } on PlatformException catch (e) {
      // 可以在这里添加更复杂的错误处理逻辑
      print("获取平台版本失败: '${e.message}'");
      // 还可以选择抛出错误、记录日志或执行其他错误处理措施
      return null;
    }
  }

  // 在这里可以继续添加更多与原生交互的方法
}

调用示例:

 void _getPlatformVersion() async {
    // 调用 NativeChannelManager 的 getPlatformVersion 方法
    String? platformVersion = await NativeChannelManager.instance.getPlatformVersion();
    // 打印返回值
    print("platformVersion: $platformVersion");
   }

调用时机
最好在 Flutter 的 Widget 生命周期的合适时机(如 initState)调用原生方法,确保当界面准备好的时候,原生数据也准备就绪。

注意事项

  • 确保 Flutter 与原生两端约定好的通道名称和方法名称一致,避免通信失败。
  • 对于可能出现的任何异步操作,务必处理原生代码中可能出现的异常,并在 Dart 中恰当地对 Future 结果进行处理。
  • 通信的数据类型,需要各平台都支持的类型,最好都统一成String。

结语

通过以上步骤,你已经掌握了如何在 Flutter 应用中使用 MethodChannel 与 iOS 代码进行通信。这种方法不仅能帮助你充分利用设备的原生功能,还能提升应用的性能和用户体验。无论是调用相机、获取位置信息,还是其他复杂的原生操作,MethodChannel 都能为你提供一个简洁高效的解决方案。希望这篇指南能为你的 Flutter 开发之旅增添一份助力,让你在跨平台开发的道路上更加游刃有余。Happy coding!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/705386.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

光储充一体化充电站:能源革新的绿色引擎

在这个科技日新月异的时代&#xff0c;一场绿色能源的革命正悄然兴起。 光储充一体化充电站&#xff0c;作为这场革命中的璀璨明星&#xff0c;正以其独特的魅力&#xff0c;引领我们走向更加环保、高效的未来。 光储充一体化充电站&#xff0c;顾名思义&#xff0c;将光伏发电…

Chromium源码阅读:Mojo实战:从浏览器JS API 到blink实现

​ 通过在前面几篇文章&#xff0c;我们粗略梳理了Mojo这套跨进程通信的设计思路和IDL细节。 实际上&#xff0c;Mojo不止是跨进程通信框架&#xff0c;而是跨语言的模块通信自动化系统。 在浏览器暴露的JS API&#xff0c;也是需要通过Mojo这个系统进行桥接&#xff0c;最终…

遥感图像地物覆盖分类,数据集制作-分类模型对比-分类保姆级教程

在遥感影像上人工制作分类数据集 1.新建shp文件 地理坐标系保持和影像一致&#xff0c;面类型 2.打开属性表 3.添加字段 这里分类6类&#xff0c;点击添加值添加 添加完毕 开始人工选地物类型&#xff0c;制作数据集 开始标注&#xff0c;标注的时候可以借助谷歌地图…

记录清除挖矿病毒 solrd 过程

1、发现solrd病毒 端午节期间&#xff0c;kafka 服务器被黑客攻击了&#xff0c;植入了挖矿病毒 solrd&#xff0c;这个病毒很聪明&#xff0c;内存&#xff0c;CPU并没有异常升高&#xff0c;以致于上班第一天完全没有察觉。 上班第一天 正常登录服务器查看 flink ,消费kafka…

Eclipse创建Spring项目

第一步&#xff1a;先用Eclipse创建一个tomcat项目 打开eclipse 配置tomcat 这里点击add去添加tomcat 创建项目 写好项目名字&#xff0c;点击next 将这个Deploy path修改一下 配置一下项目&#xff0c;将项目部署到tomcat上面去 写个html测试一下 <html><h1>Hel…

tensorboard终于不报错了!

之前tensorboard笔记,记录2种使用方法&#xff0c;可以参考&#xff01; 有图这也没有数据啊这也。实际是没点对&#xff0c;干了个大噶。选择上方scalars就能看见图了&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&…

GitHub新手使用基本流程(保姆级教程)

GitHub&#xff0c; 一个聚合了海量开源免费的软件、电子书、视频课等资源的神仙网站&#xff0c;如果你还不会用GitHub&#xff0c;这条保姆级教程&#xff0c;您千万不要错过。 首先打开浏览器搜索GitHub, 点击进入官网 如果遇到无法加载的问题&#xff0c;可以试试这个名叫…

机器视觉:工业相机的主要参数

工业相机是将目标物体的表面特征信息转化为数字信号&#xff08;或者模拟信号&#xff09;的一种采集设备。 一、工业相机的成像原理 工业相机主要由光电传感器和转换电路组成。 光线照射到被检测物体的表面&#xff0c;反射光经过透镜&#xff0c;再进入相机的光电传感器&a…

从报名到领证:软考初级【信息系统运行管理员】报名考试全攻略

本文共计9991字&#xff0c;预计阅读33分钟。包括七个篇章&#xff1a;报名、准考证打印、备考、考试、成绩查询、证书领取及常见问题。 一、报名篇 报名条件要求&#xff1a; 1.凡遵守中华人民共和国宪法和各项法律&#xff0c;恪守职业道德&#xff0c;具有一定计算机技术…

flask基础3-蓝图-cookie-钩函数-flask上下文-异常处理

目录 一&#xff1a;蓝图 1.蓝图介绍 2.使用步骤 3.蓝图中的静态资源和模板 二.cookie和session 1.cookie 2.flask中操作cookie 3.session 4.session操作步骤 三.请求钩子 四.flask上下文 1.介绍 2.请求上下文&#xff1a; 3.应用上下文 3.g对象 五&#xff1a;…

STM32高级控制定时器(STM32F103):TIM1和TIM8介绍

目录 概述 1 认识TIM1和TIM8 2 TIM1和TIM8的特性 3 TIM1和TIM6时基和分频 3.1 时基单元 3.2 预分频 3.3 时基和分频相关寄存器 3.3.1TIMx_CR1 3.3.2 TIMx_PSC 概述 本文主要介绍STM32高级定时器TIM1和TIM8的功能&#xff0c;还介绍了与之相关的寄存器的配置参数。包括…

如何在3天内开发一个鸿蒙app

华为鸿蒙操作系统&#xff08;HarmonyOS&#xff09;自2.0版本正式上线以来&#xff0c;在短时间内就部署超过了2亿台设备&#xff0c;纵观全球操作系统的发展史&#xff0c;也是十分罕见的。与其他手机操作系统不同&#xff0c;HarmonyOS自诞生之日起&#xff0c;就是一款面向…

layui一个页面多个table显示时工具栏被下方的table遮挡

记录&#xff1a;layui一个页面多个table显示时工具栏被下方的table遮挡 css代码&#xff1a; [lay-idcurrentTableId] .layui-table-tool {position: relative;z-index: 9999;width: 100%;min-height: 50px;line-height: 30px;padding: 10px 15px;border-width: 0;border-bot…

c#中上传超过30mb的文件,接口一直报404,小于30mb的却可以上传成功

在一次前端实现上传视频文件时,超过30mb的文件上传,访问接口一直报404,但是在Swagger中直接访问接口确是正常的,且在后端控制器中添加了限制特性,如下 但是却仍然报404,在apifox中请求接口也是报404, 网上说: 在ASP.NET Core中,配置请求过来的文件上传的大小限制通常…

jfif格式怎么转换成jpg?关于将jfif转成jpg的几种方法

jfif格式怎么转换成jpg&#xff1f;JFIF格式是一种常见的图像文件格式&#xff0c;通常用于存储数字照片。然而&#xff0c;在某些情况下&#xff0c;你可能需要将JFIF格式转换为JPG格式。JPG格式是一种广泛使用的图像格式&#xff0c;它被支持和接受的程度比JFIF更高。PNG是一…

C++迈向精通:当我尝试修改虚函数表

尝试修改虚函数表 本期纯整活儿好吧&#xff01;&#xff01;&#xff01;&#xff01; 初衷 有一天我突然开始好奇虚函数表是否真的存在&#xff0c;于是我开始想是否能够从C中查看或者调用虚函数表中的内容。&#xff0c;于是有了下面的操作。 操作过程 起初我并没有思路…

加入牛导研究团队|普通高校老师获得香港理工大学访问学者邀请函

随着国内高校高层次人才引进机制的日益完善&#xff0c;本校教师也倍感竞争压力日趋激烈&#xff0c;而出国访学&#xff0c;加入牛导的科研团队&#xff0c;发表高质量的论文&#xff0c;是提升自己学术水平的有效途径。本案例中的O老师就是借助知识人网的帮助&#xff0c;实现…

docker-compose harbor 2.11

harbor 前言 “Harbor” 是一个用于管理容器镜像的开源仓库项目。由 VMware 开发和维护,Harbor 提供一个企业级的 Docker 镜像仓库,具有丰富的功能,包括: 镜像管理:提供存储和分发 Docker 镜像的能力。安全性:支持镜像签名和漏洞扫描,确保镜像的安全性。身份认证:集成…

SECS/GEM 底层协议解析

SECS是什么&#xff1f; SEMI电子半导体联盟,为实现设备与工厂系统的快速对接数据,状态,配方,程序的标准化协议,SECS具有多个版本,本文主要介绍E5协议 HSMS通信方式,设备端的处理流程(Passive模式)。 SECS关键字 Host 主机一般指向工厂控制系统EQP 单机设备Active 在Tcp通信…

SAP 价格金额信息控制

1)migo / mb51/mb51/mb59 关于价格和金额的显示&#xff0c;需要权限控制&#xff0c;当权限对象F_BKPF_BUK,检查对应【公司代码】 和 ACTVT有03’的权限&#xff0c;如果没有03的权限&#xff0c;对应行的价格和金额显示为空 关于价格和金额的显示&#xff0c;需要权限控制&a…