首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用Pigeon包从Flutter调用原生iOS函数?

Pigeon是一种用于Flutter和原生平台之间进行通信的代码生成器。它可以帮助开发者在Flutter应用程序中调用原生iOS函数。下面是使用Pigeon包从Flutter调用原生iOS函数的步骤:

  1. 首先,在Flutter项目的pubspec.yaml文件中添加pigeon依赖:
代码语言:txt
复制
dependencies:
  flutter:
    sdk: flutter
  pigeon: ^0.1.0
  1. 运行flutter pub get命令来获取依赖包。
  2. 创建一个名为pigeon.dart的文件,并定义一个继承自FlutterApi的类,该类将包含要调用的原生iOS函数的方法。例如:
代码语言:txt
复制
import 'package:pigeon/pigeon.dart';

class FlutterApi {
  Future<void> callNativeFunction(String argument) async {}
}

@HostApi()
abstract class NativeApi {
  void nativeFunction(String argument);
}
  1. 运行flutter pub run pigeon命令来生成相应的Flutter和原生代码。
  2. 在原生iOS项目中,创建一个名为Pigeon.swift的文件,并定义一个继承自FlutterApi的类,实现在步骤3中定义的方法。例如:
代码语言:txt
复制
import Flutter
import UIKit

public class NativeApiImpl: NSObject, FlutterApi {
  public func callNativeFunction(argument: String?, error: AutoreleasingUnsafeMutablePointer<FlutterError?>) {
    // 在这里实现原生iOS函数的逻辑
  }
}
  1. 在原生iOS项目的AppDelegate.swift文件中,将生成的NativeApiImpl类注册为Flutter的插件。例如:
代码语言:txt
复制
import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
    let api = NativeApiImpl()
    FlutterApiSetup(controller.binaryMessenger, api: api)
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}
  1. 在Flutter项目中,使用生成的Flutter代码调用原生iOS函数。例如:
代码语言:txt
复制
import 'package:flutter/material.dart';
import 'package:pigeon/pigeon.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  final FlutterApi api = FlutterApi();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter App'),
        ),
        body: Center(
          child: RaisedButton(
            child: Text('Call Native Function'),
            onPressed: () {
              api.callNativeFunction('Hello from Flutter');
            },
          ),
        ),
      ),
    );
  }
}

通过以上步骤,你可以在Flutter应用程序中使用Pigeon包调用原生iOS函数。请注意,这只是一个简单的示例,实际情况中可能涉及更复杂的逻辑和参数传递。如果需要更多详细信息和示例代码,可以参考Pigeon文档

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Flutter混编工程之高速公路Pigeon

,如果是@FlutterApi,那么则代表原生调用Flutter的方法。...优化 在实际的使用中,Flutter调用原生方法来获取数据,原生侧处理好数据后回传给Flutter,所以在Pigeon生成的Android代码中,协议函数的实现是一个带返回值的方法,如下所示。...❝这里只介绍了Flutter调用Android的场景,实际上Android调用Flutter也只是换了个方向而已,代码都是类似的,这里不赘述了,那iOS呢?——我写Flutter,关iOS什么事。...❞ 拆解 在了解了Pigeon如何使用之后,我们来看下,这只「鸽子」到底做了些什么。 宏观上来看,不管是Dart端还是Android端,都是生成了三类东西。...下面就是Pigeon的核心了,我们来看具体的协议是如何实现的,首先来看下Dart中是如何实现的,由于我们是Flutter调用Android中的代码,所以按照Channel的原理来说,我们需要在Dart

1.4K20

Google 2020开发者大会Flutter专题

同样,在Flutter插件的开发中,因为涉及到Native双端代码开发能力,Dart侧暴露统一的接口给使用者,也会出现同样的问题,此时Pigeon应运而生,PigeonFlutter官方推荐插件管理工具...Pigeon接入 接下来我们看一下如何零接入Pigeon。截止目前,Pigeon已经发布了0.1.15版本,如下图所示。...Android 工程代码 使用Android Studio打开Flutter项目的原生Android工程,生成的代码如下: // Autogenerated from Pigeon (v0.1.15),...iOS 使用Xcode打开Flutter项目的iOS工程,把生成的 pigeon.h 和 pigeon.m 文件 link 到 Xcode 工程里,之后如下代码所示在 AppDelegate.h 引入...[在这里插入图片描述] 总结起来,就是在一些富交互类应用和新型的应用中使用Flutter,对于视频、直播等渲染要求高的则继续使用原生进行开发。

1.3K00

Flutter 官方尝试放只“鸽子”来简化Native插件开发

Flutter原生插件的开发上默认是需要开发者重复地写模版代码来接入,而近期 Flutter 团队最近发布了一个 package: https://pub.flutter-io.cn/packages...flutter pub run pigeon --input pigeons/message.dart --dart_out lib/pigeon.dart --objc_header_out ios...(getFlutterView(), new MyApi()); } } iOSiOS 上首先要先把生成的 pigeon.h 和 pigeon.m 文件 link 到 Xcode 工程里,之后如下代码所示在...中的 Api 去调用 search 方法,就可以完成 dart 到原生的通信逻辑,最后在终端看到 Hi GSY 的输出。...通过这套规则,在实现原生插件时我们可以少些很多重复代码,当然上述是直接在 Flutter App 工程中集成接入 pigeon ,正常流程应该是在插件工程中去使用

1.1K20

企业微信超大型工程-跨全平台UI框架最佳实践

但是UI还是各平台独自处理,开发的角度来看,移动端的android、ios,电脑端的mac、pc,同样的界面布局,却需要写两套逻辑代码,因此,ui的跨平台诉求是我们的一大痛点。...2. pigeon的问题 企业微信是亿万级的项目,业务场景也十分复杂,在实际接入使用pigeon 的过程中,受到了非常大的业务挑战,在使用中发现pigeon还是存在着不少的问题。...调用过程如下 : 整体的流程看,除了虚函数的实现需要业务逻辑方自己处理之外,其他的能力几乎是全自动生成,后台和客户端也可以共用一份rpc的proto。...考虑到一个方法的开始和结束存在以下几种情况: 带返回的函数,需要在这个函数主体的开始添加markStart调用,需要在这个函数的return语句前添加markEnd调用。...,需要在这个函数主体的开始添加markStart调用,需要在这个函数主体的结束添加markEnd调用,在这个的return语句前添加markEnd调用

4K52

企业微信Flutter与大型Native工程跨四端融合实践

2: Flutter 上层的开发避免不了使用原生已有的接口,需要与宿主工程的接口打通,而宿主工程又包含 Android/iOS/MAC/Windows 四大平台,并且上层的接口使用的语言各不一样,因此需要考虑一套多端跨语言的通信建设...1: 如何高效复用 C++统一跨平台能力 dart 2.15 之后提供了 dart::ffi 的方式调用 c/c++ ,在项目的实际开发过程中,我们也遇到一些大型工程下 ffi 的使用问题: 1: dart...调用 c++操作步骤繁琐, 接口维护和约束困难 2: c++调用 dart 方法只支持静态方法或者顶层函数 3: dart 上开放了指针的分配和释放,调用 c++之后内存管理混乱,容易造成内存泄漏 4...另外调用 c++的接口不再受限于静态方法或者顶层函数,开发调用 c++的接口就跟调用本地的 dart 接口是一样的。...2: 原生切换到 Flutter 容器的时候,先展示 IOS 的导航栏,动画消失后再把 IOS 的导航栏隐藏掉。

2.7K21

Flutter 多引擎渲染,在稿定 App 的实践(二):原理篇

像笔者公司前期是用 flutter_boost 做页面容器混合型,但现在架构上的变化,会逐渐减少 Native 的实现,变为跨端架构,而纯 Flutter 并不满足于我们的开发,且代码量上也不可能改为...解决开发使用痛点,减少开发难度曲线,自动生成调用 ComponentAPI 给 Native 侧无感调用抹平开发使用成本。 下面会开发流程的角度,逐步分析整套方案的实现关键点。...FGUIComponentAPI 生成双端调用iOS 官方示例 我们可以得知: 一个 FlutterEngineGroup 包括多个 FlutterEngine 实例 FlutterEngine...调用使用。...h 文件 m 文件过长,这里忽略展示,里面为了减少依赖以及多项目使用,是通过反射的形式生成调用代码。

1.5K20

Flutter混编工程之轻量化改造

,就拿网络请求来说,在Flutter内部将请求数据全部掉后,Flutter需要实现原生网络请求的所有逻辑,例如拦截器,加密,重定向等等功能,同时,如果以后对网络逻辑有所改动,那么原生侧和Flutter...轻量化改造实践 首先,我们通过Pigeon生成接口协议和调用代码,原生侧分别基于当前协议来进行开发。 不过,我们需要解决Pigeon CLI脚本只能有一个协议文件的问题。...首先,依然是借用Pigeon的那一套东西,生成相应的Channel代码,之所以要使用Pigeon来生成代码的原因,主要还是Pigeon使用了BasicMessageChannel来进行Channel通信...SingleFlutterActivity.start(activity, "main"); 而在Flutter界面中,可以通过协议非常方便的调用原生方法。...❝其它对应需要桥接原生的能力,只需要新增接口即可,例如埋点,新增曝光和点击接口,在Flutter调用协议即可实现。

69210

Flutter 2.5正式版发布,带来重大更新

彩色框架图,用于识别应用中的应用、原生、Dart 和 Flutter 代码活动。...最新版本还包括预览来自 pub.dev 使用的图标的新功能,这些是围绕 TrueType 字体文件(#5504、#5595、#5595、#5704)构建的,就像 Material 和 Cupertino...这些命令提供的功能类似于Jeroen Meijer 的 Pubspec Assist 插件,新命令开箱即用,并提供定期 pub.dev 获取的类型过滤列表。...目前,Flutter 团队的一些插件中已经使用Pigeon,在此版本中它提供了更多有用的错误消息,增加了对泛型、原始数据类型作为参数和返回类型以及多个参数的支持,预计开发者将来会更频繁地使用它。...放弃对市场份额不到 1% 的 iOS 8 的支持,使 Flutter 团队能够专注于更广泛使用的新平台,弃用意味着这些平台可以工作,但我们不会在这些平台上进行功能的更新和插件的支持。

4.3K50

Flutter 多引擎渲染,在稿定 App 的实践

multiple-flutters 绝对是 Flutter 的坑中之王 首先,Flutter 版本至少升级到 2.10+,才能有初步的 iOS / Android 多引擎同时布局的可用性。...但建议升级到 Flutter 3+ ,2.5.3 ~ 2.10.5 版本中,iOS 有内存崩溃风险,详细原因可以见同事发的这篇 解决 Flutter 引起的 iOS 内存崩溃问题。...再就是在打包 flutter Android 时又发现, flutter_boost 报错, github issues 了解到,flutter_boost 并没去支持 Flutter 2.10.x,...根据 issues 建议,2.8+版本上存在 Release 不可用的问题,推荐降低到 2.5.3,这才总算是 FlutterEngineGroup 初步落地的可行性坑中爬了出来。...image.png 上图即为自动生成的开发文档,可以看到 Native 调用上是完全无感知的,右侧的预览页面也是天然使用 Flutter 跨端 Web 的能力,直接把 Flutter Example 输出在文档上

1.1K20

Flutter 2.5正式版发布,带来多项重大更新

彩色框架图,用于识别应用中的应用、原生、Dart 和 Flutter 代码活动。...[在这里插入图片描述] 最新版本还包括预览来自 pub.dev 使用的图标的新功能,这些是围绕 TrueType 字体文件(#5504、#5595、#5595、#5704)构建的,就像 Material...[在这里插入图片描述] 这些命令提供的功能类似于Jeroen Meijer 的 Pubspec Assist 插件,新命令开箱即用,并提供定期 pub.dev 获取的类型过滤列表。...[在这里插入图片描述] 目前,Flutter 团队的一些插件中已经使用Pigeon,在此版本中它提供了更多有用的错误消息,增加了对泛型、原始数据类型作为参数和返回类型以及多个参数的支持,预计开发者将来会更频繁地使用它...放弃对市场份额不到 1% 的 iOS 8 的支持,使 Flutter 团队能够专注于更广泛使用的新平台,弃用意味着这些平台可以工作,但我们不会在这些平台上进行功能的更新和插件的支持。

3.5K00

Flutter 多引擎渲染,在稿定 App 的实践(三):躺坑篇

根据 issues 建议,2.8+版本上存在 Release 不可用的问题,推荐降低到 2.5.3,这才总算是 FlutterEngineGroup 初步落地的可行性坑中爬了出来。...如何 Flutter 内部控制 Size 外部约束必须提供宽高才可正确显示 FlutterView。...在使用 flutter debug 情况下,每个引擎会多占用 100 M 内存,且在同时渲染 10 个引擎的情况下,会导致页面卡死。...最终的处理方案是反射解耦,双端生成的调用类不再依赖 Pigeon 生成的 API 类,而是通过反射的形式去调用,外部调用者只需引用 FGUIComponentAPI 模块,即可使用 Flutter UI...Flutter 手势失效 在 iOS 上,由于 Flutter使用更底层的 touch 事件,响应优先级比手势低,如果布局上存在 Native 手势,就会被手势拦截,产生 FlutterView 无响应的问题

2.1K20

Flutter鸿蒙终端一体化—鹊桥相会

,所以,秉着能用工具解决的问题就不要自己写的原则,我们参考Native的Flutter Channel的实现,也就是pigeon的方式,不熟悉的同学可以参考我之前的文章。...Flutter混编工程之高速公路Pigeon 这套东西在鸿蒙中也有的适配,可以一键生成ets代码,方便我们进行多端复用,项目地址如下。...https://gitee.com/openharmony-sig/flutter_packages/tree/master/packages/pigeon 在鸿蒙中使用也非常简单,指定引用即可,代码如下所示...Native保持一致,通过调用setup方法,传入接口的实现即可,这里就不赘述了。...这样一来,我们的通信协议就打通了,Flutter的代码基本可以无损迁移,在鸿蒙侧,只需要根据协议实现对应的Channel接口即可,这样就完成了Android、iOS、鸿蒙的UI多端统一,Flutter

55710

Flutter技术与实战(5)

Flutter 如何实现一次方法调用请求 在原生代码中完成方法调用的响应 总结 思考 如何在Dart层兼容Android/IOS平台特定实现(二) 构造一个复杂App需要什么 平台视图 Flutter...如何实现原生视图的接口调用 如何原生系统实现接口 如何在程序运行时,动态地调整原生视图的样式 如何原生应用中混编Flutter工程 准备工作 Flutter混编方案介绍 集成Flutter 总结...作为调用发起方的 Flutter如何实现原生视图的接口调用如何原生(Android 和 iOS)系统实现接口?...Flutter 如何实现原生视图的接口调用 在 SampleView 的内部,分别使用原生 Android、iOS 视图的封装类 AndroidView 和 UIkitView,并传入了一个唯一标识符... Flutter 页面打开新的原生页面; Flutter 页面回退到旧的原生页面。 Flutter 并没有提供对原生页面操作的方法,所以不可以直接调用

15.7K30

关于Flutter 2.5稳定版你知道多少?

如果你要构建 iOS 应用,我们还有最后一项性能更新:在该版本中,使用 Apple Silicon M1 Mac 构建的 Flutter 应用可以直接在 ARM 架构的 iOS 模拟器 (#pull/85642...此外,当你追踪应用中的 CPU 性能问题时,可能已经淹没在了来自 Dart 和 Flutter 库或引擎的原生代码的剖析数据中。...Pigeon 已经应用在 Flutter 团队的一些插件中。这个版本提供了更多有用的错误信息,增加了对泛型、原始数据类型作为参数和返回类型以及多参数的支持,在未来它会被更广泛地使用。...如果你想在自己的插件或 add-to-app 的项目中使用 Pigeon,请查阅 pigeon 插件页面 找到更多信息。...放弃对市场份额不足 1% 的 iOS 8 的支持,使 Flutter 团队能够专注于使用范围更广的新平台。

3.7K20

构建属于自己的Flutter混合开发框架

如何原生进行交互,可以查看我之前的文章:混合开发简介 完成Dart 层接口封装后,接下来再看一下 Android 和 iOS 代码宿主是如何响应 Dart 层的接口调用的。...第一,如何使用 FlutterPluginNetworkPlugin 插件,也就是模块工程功能如何实现; 第二,模块工程的 iOS 构建产物应该如何封装,也就是原生 iOS 工程如何管理 Flutter...在下面的示例代码中,我们在界面上显示一个 RaisedButton 按钮,在其点击回调函数使用 FlutterPluginNetwork 插件发起了一次网络接口调用,并把网络返回的数据打印到了控制台上...在纯Flutter 工程中,管理第三方依赖库使用的是.packages 文件存储,它使用的是依赖名与系统缓存中的文件路径。...使用下面的命令即可生成插件工程的aar。 cd android .

1.4K10

Flutter进阶篇(5)-- 使用Flutter创建插件详解并发布到Pub库

Flutter提供了和原生做交互的方式,我们通过和原生交互就可以达到Flutter调用原生平台的相关功能的目的。...本文首发在公众号Flutter那些事,欢迎大家多多关注。 下面详细的讲解一下Flutter如何创建一个插件,并且教大家上传到Pub库,让大家也体验一把自己的库被别人使用的自豪感。...Flutter调用原生平台交互示意图 (2)创建Flutter Plugin插件项目 使用Android Studio/Intellij IDEA创建项目,截图如下: ?...-org:定义项目的组织结构 -a:用什么语言编写Android代码 --description:插件的描述 -i:用什么语言编写iOS代码 上面那个命令的意思是:创建一个插件,名为“com.awei...“ios”目录是插件API在iOS平台的实现。 “example”目录是使用插件的一个示例项目。

2.9K30

Flutter实战:手把手教你写Flutter Plugin

什么是Flutter Plugin Flutter Plugin是一种特殊的,一个插件包含一个用Dart编写的API定义,结合Android和iOS的平台特定实现,从而达到二者兼容。...如何原生接收Flutter传递过来的数据?...到这里,我们已经可以完成Flutter调用原生并接收数据,从而完成微信注册。但这样做并不能让我们满意,原因有2个: 如何告诉Flutter我们的处理结果?...nil : tagName]; 原生如何调用Flutter 当我们完成分享时,我们可能需要将分享结果传回Flutter。...总结 通过本文的学习,我们已经了解了如何亲手编写一个Flutter插件,并且至少掌握以下几点: 创建一个Flutter Plugin项目 Flutter调用原生 原生调用Flutter Flutter调用原生的结果处理

5.5K20
领券