Flutter开发进阶之Package

Flutter开发进阶之Package

通常我们在Flutter开发中需要将部分功能与整体项目隔离,一般有两种方案Plugin和Package,Application是作为主体项目,Module是作为原生项目接入Flutter模块。
Flutter开发进阶
当独立模块不需要与原生项目通讯只需要Plugin就可以,但是当需要与原生通讯就需要Package。

一、创建Package

cd /Users/kevin/Desktop/Myflutter create --org com.kevin --template=plugin --platforms=android,ios -a kotlin -i swift  package_demo

创建Package必须指定平台:
android、ios、web、linux、macos 和 windows。
命令中-a后是指定Android的开发语言,-i是指定iOS的开发语言。
Package

二、通讯

Package会自动创建MethodChannel,还可以根据需要创建BasicMessageChannel和EventChannel。

Flutter
class MethodChannelPackageDemo extends PackageDemoPlatform {/// The method channel used to interact with the native platform.final methodChannel = const MethodChannel('package_demo_method');final messageChannel = const BasicMessageChannel('package_demo_message', StandardMessageCodec());final eventChannel = const EventChannel('package_demo_event');MethodChannelPackageDemo() {methodChannel.setMethodCallHandler((call) async {/// 方法return call.method;});messageChannel.setMessageHandler((message) async {/// 字符串和半结构化return message;});eventChannel.receiveBroadcastStream().listen((event) {/// 事件流}, onError: (error) {///}, cancelOnError: true,);}Future<String?> getPlatformVersion() async {final version = await methodChannel.invokeMethod<String>('getPlatformVersion');return version;}
}
iOS
public class PackageDemoPlugin: NSObject, FlutterPlugin {public static func register(with registrar: FlutterPluginRegistrar) {let methodChannel = FlutterMethodChannel(name: "package_demo_method", binaryMessenger: registrar.messenger())let instance = PackageDemoPlugin()registrar.addMethodCallDelegate(instance, channel: methodChannel)}public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {switch call.method {case "getPlatformVersion":result("iOS " + UIDevice.current.systemVersion)default:result(FlutterMethodNotImplemented)}}
}
Android
class PackageDemoPlugin: FlutterPlugin, MethodCallHandler {/// The MethodChannel that will the communication between Flutter and native Android////// This local reference serves to register the plugin with the Flutter Engine and unregister it/// when the Flutter Engine is detached from the Activityprivate lateinit var methodChannel : MethodChanneloverride fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {methodChannel = MethodChannel(flutterPluginBinding.binaryMessenger, "package_demo_method")methodChannel.setMethodCallHandler(this)}override fun onMethodCall(call: MethodCall, result: Result) {if (call.method == "getPlatformVersion") {result.success("Android ${android.os.Build.VERSION.RELEASE}")} else {result.notImplemented()}}override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {channel.setMethodCallHandler(null)}
}

三、调用原生控件

Flutter
class PackageView extends StatelessWidget {const PackageView({super.key});Widget build(BuildContext context) {// TODO: implement buildif (Platform.isAndroid) {return AndroidView(viewType: 'package_demo/android',onPlatformViewCreated: (id) {},creationParams: const {'type': 'android'},creationParamsCodec: const StandardMessageCodec(),);} else if (Platform.isIOS) {return UiKitView(viewType: 'package_demo/ios',onPlatformViewCreated: (id) {},creationParams: const {'type': 'ios'},creationParamsCodec: const StandardMessageCodec(),);}return const SizedBox();}
}
iOS
public class PackageDemoPlugin: NSObject, FlutterPlugin {public static func register(with registrar: FlutterPluginRegistrar) {let methodChannel = FlutterMethodChannel(name: "package_demo_method", binaryMessenger: registrar.messenger())let instance = PackageDemoPlugin()registrar.addMethodCallDelegate(instance, channel: methodChannel)registrar.register(PackageViewFactory(), withId: "package_demo/ios")}public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {switch call.method {case "getPlatformVersion":result("iOS " + UIDevice.current.systemVersion)default:result(FlutterMethodNotImplemented)}}
}class PackageViewFactory: NSObject, FlutterPlatformViewFactory {func create(withFrame frame: CGRect, viewIdentifier viewId: Int64, arguments args: Any?) -> FlutterPlatformView {return PackageView()}func createArgsCodec() -> FlutterMessageCodec & NSObjectProtocol {return FlutterStandardMessageCodec.sharedInstance()}}class PackageView: NSObject, FlutterPlatformView {func view() -> UIView {return UIView()}}
Android
class PackageDemoPlugin: FlutterPlugin, MethodCallHandler {/// The MethodChannel that will the communication between Flutter and native Android////// This local reference serves to register the plugin with the Flutter Engine and unregister it/// when the Flutter Engine is detached from the Activityprivate lateinit var methodChannel : MethodChanneloverride fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {methodChannel = MethodChannel(flutterPluginBinding.binaryMessenger, "package_demo_method")methodChannel.setMethodCallHandler(this)flutterPluginBinding.platformViewRegistry.registerViewFactory("package_demo/android", PackageViewFactory());}override fun onMethodCall(call: MethodCall, result: Result) {if (call.method == "getPlatformVersion") {result.success("Android ${android.os.Build.VERSION.RELEASE}")} else {result.notImplemented()}}override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {methodChannel.setMethodCallHandler(null)}
}class PackageViewFactory: PlatformViewFactory(StandardMessageCodec.INSTANCE){override fun create(context: Context?, viewId: Int, args: Any?): PlatformView {return PackageView(context)}}class PackageView internal constructor(context: Context?): PlatformView{override fun getView(): View? {TODO("Not yet implemented")}override fun dispose() {TODO("Not yet implemented")}}

四、添加进项目

Package创建成功后可以放置在本地或者上传到github,通过path:或者git: \n url: \n ref: 去添加进项目,通过指定版本去建立依赖。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【广度优先搜索】【网格】【割点】1263. 推箱子

作者推荐 视频算法专题 涉及知识点 广度优先搜索 网格 割点 并集查找 LeetCode:1263. 推箱子 「推箱子」是一款风靡全球的益智小游戏&#xff0c;玩家需要将箱子推到仓库中的目标位置。 游戏地图用大小为 m x n 的网格 grid 表示&#xff0c;其中每个元素可以是墙、地板或…

计算几何相关算法汇总

目录 1 专题说明2 算法参考 1 专题说明 本专题用来记录计算几何相关算法&#xff0c;包括&#xff1a; 求两个矩形的交集。 2 算法 算法&#xff1a;求两个矩形的交集 C实现&#xff0c; // 定义矩形结构体 struct Rectangle {int x1, y1; // 左下角坐标int x2, y2; // 右…

利用LaTex批量将eps转pdf、png转eps、eps转png、eps转svg、pdf转eps

1、eps转pdf 直接使用epstopdf命令&#xff08;texlive、mitex自带&#xff09;。 在cmd中进入到eps矢量图片的目录&#xff0c;使用下面的命令&#xff1a; for %f in (*.eps) do epstopdf "%f" 下面是plt保存eps代码&#xff1a; import matplotlib.pyplot as…

javafx环境搭建

参考链接 使用上述参考搭建javafx环境。

ABC342A-E题解

文章目录 A题目AC Code&#xff1a; B题目AC Code&#xff1a; C题目AC Code&#xff1a; D题目AC Code&#xff1a; E题目AC Code: A 题目 这个 A 题为什么是平时 B 题的分值&#xff1f; 统计每一个字母的出现次数&#xff0c;找到出现次数为 1 1 1 的字母&#xff0c;输…

计算机网络面经-TCP的拥塞控制

写在前边 前边我们分享了网络分层协议、TCP 三次握手、TCP 四次分手。今天我们继续深入分享一下 TCP 中的拥塞控制。 对于 TCP 的拥塞控制,里边设计到很多细节,平平无奇的羊希望通过这一节能够将这部分内容串通起来,能够让你更深刻的记忆这部分内容。 思维导图 1、什么…

封装(encapsulation)

封装[encapsulation] 封装介绍封装好处封装的实现步骤&#xff08;三步&#xff09;入门案例封装与构造器 封装介绍 封装就是把抽象的数据[属性]和对数据的操作[方法]封装在一起&#xff0c;数据被保护在内部&#xff0c;程序的其它部分只有通过被授权的操作[方法]&#xff0c;…

HDL FPGA 学习 - 入门好文,相关网站、开发板、教程推荐

目录 O.0 值得跟着的学习网站 0.25 开源 & 学习 FPGA 开发板 0.5 FPGA 相关好文杂文存放 编辑整理 by Staok&#xff0c;始于 2021.2 且无终稿。转载请注明作者及出处。整理不易&#xff0c;请多支持。 本文件是“瞰百易”计划的一部分&#xff0c;尽量遵循“二项玻”定…

vue项目的前端工程化思路webpack(持续更新中)

写在前面&#xff1a;现在的前端网页功能丰富&#xff0c;特别是SPA&#xff08;single page web application 单页应用&#xff09;技术流行后&#xff0c;JavaScript的复杂度增加和需要一大堆依赖包&#xff0c;还需要解决Scss&#xff0c;Less……新增样式的扩展写法的编译工…

ubuntu 学习

软件包 #查找软件包 apt-cache search qemudpkg-query -L gcc-13-arm-linux-gnueabihfapt-get install bzip2 --yes 参考 Linux下apt-get命令详解&#xff08;安装、卸载、更新、查询软件包&#xff09; - 知乎dpkg-query命令 – 在dpkg数据库中查询软件包 安装gcc工具 a…

JavaScript 进阶01

作用域 局部作用域 局部作用域分为函数作用域和块作用域。 函数作用域 在函数内部声明的变量只能在函数内部被访问&#xff0c;外部无法直接访问。函数执行完毕后&#xff0c;函数内部的变量实际被清空了 块作用域 在 JavaScript 中使用 {} 包裹的代码称为代码块&#xf…

P1443 马的遍历题解

题目 有一个nm的棋盘&#xff0c;在某个点(x,y)上有一个马&#xff0c;要求你计算出马到达棋盘上任意一个点最少要走几步。 输入输出格式 输入格式 输入只有一行四个整数&#xff0c;分别为n,m,x,y。 输出格式 一个nm的矩阵&#xff0c;代表马到达某个点最少要走几步&…

DC与DCT DCG的区别

先进工艺不再wire load model进行静态时序分析&#xff0c;否则综合结果与后端物理电路差距很大&#xff0c;因此DC综合工具也进行了多次迭代&#xff0c;DC工具有两种模式&#xff0c;包括wire load mode和Topographical Mode&#xff0c;也就是对应的DC Expert和DC Ultra。 …

python有哪些应用

Python是一种功能强大且灵活的编程语言&#xff0c;具有广泛的应用领域。以下是Python常见的一些应用&#xff1a; Web开发&#xff1a; Python常用于构建Web应用程序。流行的Web框架包括Django、Flask和Pyramid等&#xff0c;它们提供了强大的工具和库来简化开发过程。 数据科…

unity hub (第一部)初学配置

1、安装Unity Hub 2、设置中文 3、安装编辑器 4、新建项目 5、新建完成后进入编辑器 6、 编辑器设置中文 editPreferencesLanguages选择中文

【Webpack】Webpack 优化

提升开发体验 使用 Source Map 让开发或上线时代码报错能有更加准确的错误提示。 提升 webpack 提升打包构建速度 使用 HotModuleReplacement 让开发时只重新编译打包更新变化了的代码&#xff0c;不变的代码使用缓存&#xff0c;从而使更新速度更快。使用 OneOf 让资源文件…

机器学习基础(五)监督与非监督学习的结合

导语&#xff1a;上一节我们详细探索非监督学习的进阶应用&#xff0c;详情可见&#xff1a; 机器学习基础&#xff08;四&#xff09;非监督学习的进阶探索-CSDN博客文章浏览阅读613次&#xff0c;点赞15次&#xff0c;收藏13次。非监督学习像一位探险家&#xff0c;挖掘未标…

C语言实现五子棋小游戏

代码采用C语言编写&#xff0c;结合图形库&#xff0c;实现五子棋小游戏&#xff0c;代码如下&#xff1a; #include<fstream> #include <stdlib.h> #include <graphics.h> #include <stdio.h> #include<bits/stdc.h> #include <windows.h&…

电路设计(25)——4位数字频率计的multisim仿真及PCB设计

1.设计要求 使用4位数码管&#xff0c;显示输入信号的频率。完成功能仿真后&#xff0c;用AD软件&#xff0c;画出原理图以及PCB。 2.电路设计 输入信号的参数为&#xff1a; 可见&#xff0c;输入为168HZ&#xff0c;测量值为170HZ&#xff0c;误差在可接受的范围内。 3.PCB设…

Bluesky数据采集框架-2

访问保存的数据 到此&#xff0c;自然想到了"我如何访问我保存的数据&#xff1f;"。从bluesky的视角&#xff0c;那真的不是bluesky的关注&#xff0c;但它是一个合理的问题&#xff0c;因此我们将强调一个特定的场景。 注意&#xff1a;本章假设你正在使用databr…