首页 > 其他分享 >Flutter-使用MethodChannel 实现与iOS交互

Flutter-使用MethodChannel 实现与iOS交互

时间:2024-06-12 18:32:40浏览次数:13  
标签:原生 getPlatformVersion iOS MethodChannel NativeChannelManager Flutter channel

前言

使用 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!

标签:原生,getPlatformVersion,iOS,MethodChannel,NativeChannelManager,Flutter,channel
From: https://blog.csdn.net/lyh1083908486/article/details/139628122

相关文章

  • Apple ID已成历史,在ios18中正式更名为Apple Account
    随着iOS18的首个开发者预览版成功推送,众多热衷于尝鲜的用户已纷纷升级并开启全新体验。在这个版本中,备受瞩目的AppleID正式迎来了它的进化——更名为AppleAccount,并且拥有了中文名称“Apple账户”或简称“苹果账户”。不过目前官网还称之为AppleID,预计会在9月份随iPhone......
  • iOS快捷指令——记录今天、今年已过进度的工具
    起因是看到了大佬博客里面一个计时的小工具,于是也想搞一个来提醒自己珍惜时间。经过一段时间对快捷指令的摸索,最终选择了如下的方式完成:快捷指令的链接在这里给出:https://www.icloud.com/shortcuts/94d5327fddd344a6b333a454ad1c7bbe具体html代码如下<!DOCTYPE......
  • BIOS 编辑和修改的需求;编辑和修改 BIOS 的工具。以下是几款常见的同类工具
    AwardBIOSEditor是一种用于编辑和修改基于AwardBIOS(BasicInput/OutputSystem)的工具。BIOS是计算机主板上的一个固件,它在计算机启动过程中扮演关键角色,负责硬件初始化以及操作系统启动前的准备工作。特点与功能:BIOS修改: AwardBIOSEditor允许用户查看和修改BIOS......
  • 苹果WWDC超全总结:GPT-4o加入iOS 18 | 最新快讯
    如果不是本届WWDC24(苹果全球开发者大会)最后阶段,苹果重新定义了AI,用「AppleIntelligence」取代「ArtificialIntelligence」,那么这场苹果年度盛会的高光时刻将会变成「iPad终于有了计算器应用」这种愚人节玩笑水平的更新。但好在,苹果玩的「谐音梗」,经得起推敲和琢磨......
  • 苹果iOS 18发布:新增锁屏自定义和应用锁
    今天凌晨1点,iOS18在苹果WWDC24上正式发布。全新的iOS18允许用户自由定义App排列,可以自由选择App颜色主题,并且iOS18升级支持锁屏状态自定义功能,还支持单个App的应用锁,保护用户隐私。与此同时,iOS18对控制中心也进行了升级调整,全新的控制中心更具有扩展性,支持第三方应用控制按......
  • 【工作必备知识】Linux磁盘I/O故障排查分析定位 iostat 介绍
    【工作必备知识】Linux磁盘I/O故障排查分析定位iostat介绍大家好,我是秋意零。前言:今天,介绍Linux磁盘I/O故障排查时,必备命令iostat。该命令是监视系统I/O设备使用负载,它可以实时监视IO设备,从而帮助我们进行分析定位问题。iostat命令介绍iostat命令:监视系统I/O设备使......
  • Flutter桌面应用开发:深入Flutter for Desktop
    Flutter是一个开源的UI工具包,用于构建高性能、高保真、多平台的应用程序,包括移动、Web和桌面。安装和环境配置安装Prerequisites:JavaDevelopmentKit(JDK):安装JDK8或更高版本,因为Flutter要求JDK1.8或更高。配置环境变量JAVA_HOME指向JDK的安装路径。Flutter......
  • Axios简单完成上传图片到互联网(前端)
    操作步骤很简单,需要会使用HTML,CSS,JS以及Axios和后端提供的URL接口<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0">......
  • Flutter 急迫单子与懒惰单子。加载和实例化
    我了解eager和lazy单子之间的区别:eager在首次加载时实例化,而lazy则在首次使用(方法调用)时实例化。现在,为了充分理解两者的区别,我们应该知道加载是何时发生的。根据本文,加载发生在启动Dart虚拟机阶段。就在......
  • Mac环境如何使用Flutter Version Manager (fvm)
    Mac环境如何使用FlutterVersionManager(fvm)FlutterVersionManager(fvm)是一个Flutter版本管理工具,它允许开发者在本地安装并管理多个Flutter版本。使用fvm,您可以轻松切换不同版本的FlutterSDK,进行多项目开发而无需重复安装。本文将为您提供一个全面的指南,介......