当前位置: 首页 > news >正文

Flutter插件制作、本地/远程依赖及缓存机制深入剖析(原创-附源码)

Flutter插件在开发Flutter项目的过程中扮演着重要的角色,我们从 ​​​​​​https://pub.dev 上下载添加到项目中的第三方库都是以包或者插件的形式引入到代码中的,这些第三方工具极大的提高了开发效率。

深入的了解插件的制作、发布、工作原理和缓存机制,可以让我们对Flutter的插件机制有更深层次的理解,在开发中想自己封装插件或者在使用第三方插件遇到问题的时候,也会有更多的思路去排查问题。

本文将从以下几个方面详细的讲解Flutter插件的相关内容和原理:

  • Flutter插件的类型介绍
  • Flutter插件的详细制作流程
  • 以本地依赖的方式使用制作的Flutter插件
  • 以远程依赖的方式使用制作的Flutter插件
  • 将Flutter插件发布到开放平台
  • Flutter插件的原生层如何引用自定义的Framework
  • Flutter插件的缓存机制及更新原理

一篇文章带你从0开始详细深入的了解Flutter插件的所有知识,让我们开始吧~

一、Flutter插件的类型

引用Flutter中文社区的官方描述

Packages可以包含多种内容:

  • Dart包:其中一些可能包含Flutter的特定功能,因此对Flutter框架具有依赖性,仅将其用于Flutter,例如fluro包。

  • 插件包:一种专用的Dart包,其中包含用Dart代码编写的API,以及针对Android(使用Java或Kotlin)和/或针对iOS(使用ObjC或Swift)平台的特定实现。一个具体的例子是battery插件包。

简单来说,Flutter插件有两种类型:

  1. Package:普通的Dart包,也就是我们常说的Package,里面只包含dart代码
  2. Plugin:也就是我们说的插件包,里面除了dart代码外,还提供了安卓和iOS原生功能调用的支持(插件包其实也是一种特殊的Package,只不过默认提供了调用原生的channel通道的 实现,提供了与原生层通信的示例,使得我们开发与原生层相关的功能时更加便捷)

接下来我将用两个简单的示例来分别讲解两种包是如何制作的

二、Flutter插件的详细制作流程

Flutter插件的制作很简单,我们从头开始,通过两个简单的示例来分别讲解Package插件和Plugin插件的制作过程。

1.Package的制作

新建Flutte项目,项目类型选择Package

然后点击创建,即可完成一个Package包的制作,创建完进入项目目录如下:

进入之后其实可以看到,这是一个非常简单的工程,里面只有一个默认的跟项目同名的test_package文件,里面默认给我们创建了一个演示的类Calculator,我们可以将自己添加的代码添加到lib文件夹内,就可以作为package包提供给其他的项目来使用了。

package的包的创建很简单,我们重点说一下plugin插件制作,也会在plugin插件的制作过程中详细的剖析每个文件的作用的使用方法。

2.Plugin插件的制作

同样新建项目,项目类型我们这次选择plugin,操作如下,我们建立一个test_plugin的项目,后面的演示和深入分析也都以这个项目来作为示例。

创建完成后进入项目如下所示:

我们需要重点关注的就是四个文件夹lib、example、android、iOS以及pubspec.yaml文件

我们挨个来看:

  • pubspec.yaml文件

pubspec.yaml文件在我们日常做Flutter开发的过程中提供了对第三方依赖库和资源文件的管理,但是在plugin插件中他起到了一个非常重要的作用就是对我们的插件进行描述,同时也管理插件内引用的第三方工具和资源。

对应模块功能如下:

pubspec.yaml文件内的plugin模块定义了安卓和iOS原生层面的代码资源:

  • lib文件夹

lib文件夹下有三个文件,从下往上依次为

1.test_plugin_platform_interface.dart

test_plugin_platform_interface.dart 文件内创建了一个抽象类TestPluginPlatform,我们需要关注的是他定义了一个抽象方法,

getPlatformVersion

这个是Flutter默认创建的示例方法,该方法的作用是通过channel来调用原生层代码,分别获取安卓或者iOS端的系统版本号,并返回Flutter层来显示。

2.test_plugin_method_channel.dart

该文件内定义了一个继承了上面定义的抽象类的MethodChannelTestPlugin类,这个类提供了对getPlatformVersion方法的具体实现,同时在该类的内部创建了后面与原生端通信的channel通道。

3.test_plugin.dart

该文件很简单,可以清晰的看到他仅仅提供了一个类,该类有一个示例方法,这个方法就是对第二个文件内方法getPlatformVersion的调用。

通过这三个文件可以看出来,这三个文件其实就是Flutter 给我们创建的演示如何跟原生通道通信的功能,通过一个简单的获取原生系统版本的功能来给我们演示如何与原生层来进行通信的。

既然是与原生的通信,那么必然会有原生的代码与之交互,接下来以iOS为例,我们看一下原生端默认给我们提供了什么实现

  • iOS文件夹

可以看到,iOS文件夹里的内容也很简单,只提供了一对文件

在该文件夹内实现了TestPlugin协议,通过

+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar

方法进行通道名为test_plugin的注册,然后通过

- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result 

方法实现对该通道内方法调用的监听,当监听到对应的方法之后,则获取到本机系统的版本,并将版本数据进行返回,以此在IOS端就实现了与Flutter层通过通道来通信的功能。

iOS文件夹内还有一个重要的文件 test_plugin.podspec

  • test_plugin.podspec

该文件是对iOS原生代码的说明,是个简单的pod库声明文件,详细说明了库内引用了哪些文件以及文件的位置,引用的第三方依赖等,后面我们会引入一个自己制作的Framework来说明如何在插件的原生层内来引用自己制作的库文件。

test_plugin.podspec内部功能如下:

  • Android文件夹

安卓文件夹内的功能与iOS端功能基本一致,核心代码如下

也是注册了通道的监听,然后进行了功能逻辑的实现,并将结果返回,不再赘述。

最后一个是example文件夹

  • example文件夹

example文件夹是Flutter非常贴心的为了方便我们开发插件而制作的一个示例工程,他提供了一个main.dart文件来给我们说明如何使用我们制作的插件

运行界面如下

可以说是非常贴心了,这个示例工程是为了方便我们在开发插件的过程中进行调试,当我们制作完成后,可以将example工程从插件中移除,只需要将插件相关的功能提供出来给其他项目调用就可以了。

三、以本地依赖的方式使用制作的Flutter插件

以我们刚才制作的插件为例,我们演示一下如何以本地依赖的方式来使用我们自己制作的插件。新建一个test_project

然后在工程目录下创建文件夹

将我们刚刚制作的插件放进去

接着我们在测试项目内的pubspec.yaml文件内进行如下配置

然后执行执行flutter pub get

这样,我们就可以将我们制作的插件引入到我们正在开发中的项目中去了,我们来测试一下插件的功能,对main.dart内的文件进行尽可能的精简:

测试结果如下:

点击前:

点击后:

可以看到我们的插件已经通过本地依赖的方式集成到项目中,并已经正常工作了

四、以远程依赖的方式使用制作的Flutter插件

接下来,我们将我们制作的插件放到git上,然后看下如何通过远程依赖的方式来使用我们自己制作的插件,在github上建好仓库,并将我们自己制作的插件放进去,远端仓库建立完成如下,地址为

GitHub - TheRuningAnt/test_plugin: 测试自己制作的flutter插件

建好之后的仓库内容如下:

然后更改测试项目的pubspec.yaml,用下面的方式改为远程依赖我们制作的插件

这里我直接使用的main分支,如果我们使用的是分支 branch/1.0.0,那么将ref改为

ref: branch/1.0.0

即可

使用flutter clean清理项目,然后执行flutter pub get 即可看到我们制作的插件已经是以远端依赖的方式引入到本地了

执行完成后查看项目目录,可以发现此时插件在我们项目中的位置已经是放在External Libraries\Flutter Plugin 文件夹下作为外部插件来引用了。

经过测试,插件在我们的项目中仍然可以正常工作,说明我们通过远程依赖的方式已经成功的将插件集成到了我们项目中去。

五、将Flutter插件发布到开放平台

当我们的插件制作完成之后,就可以发布到 pub.dev 上,供其他的开发者来下载使用了,首先我们通过终端进入到我们的插件目录下

然后执行

flutter pub publish --dry-run

来对插件进行检查

当检查通过之后,就可以执行

flutter pub publish

指令指令将插件发布出去

输入y,然后点击回车,将会开始插件的上传,上传完成之后会给到一个链接地址,复制到浏览器里打开进行登陆授权之后,根据提示即可完成插件的发布。

六、Flutter插件的原生层如何引用自定义的Framework

接下来我们演示如何在插件中的原生层使用我们自定义的框架,以iOS端为例,我们先封装一个简单的SDK,然后将其引入到项目的原生层

我们先制作一个很简单的Framework,里面只包含一对文件.h和.m文件内容分别如下所示

该文件定义了一个类方法,作为测试使用。

创建完成的Framework如下

然后我们看如何将自己制作的Framework引入到Flutter插件的原生层,打开我们的test_plugin插件项目的文件夹,然后打开iOS文件夹

新建一个文件夹名叫Frameworks

然后将我们自己制作的Framework拖进去

接下是比较重要的一步,修改iOS文件夹下的test_plugin.podspec

添加

s.vendored_frameworks = ["Frameworks/*.framework"]

将我们创建的Frameworks文件夹下的自定义库都加载进来

如果要使用指定的第三方库可以这样写

s.dependency 'AFNetworking', '~> 1.0'

编辑完成之后,我们打开辅助开发的iOS项目

先在该目录下执行

pod install

更新一下本地库,然后使用Xcode打开,文件目录如下

可以看到我们创建的Frameworks文件夹已经引入到项目中去了,而且默认给我们创建了一个Development Pods虚拟文件夹,我们开发的IOS端引用的自定义库都放在了这个文件夹下

有一个比较有意思的地方是每个文件前面都有一个快捷方式的剪头

这是因为这些文件是通过引用的方式链接到我们开发的插件库的,show in finder的话会发现我们又回到了我们创建的test_plugin文件夹,这是为了方便我们做开发和调试,同样的,我们对文件的所有修改也会同步到test_plugin插件内的所有文件中去。

我们对iOS的文件做如下修改,将我们创建的库导入进来,并增加测试方法的实现

这样,当iOS层监听到testIOSFramework方法调用的时候,就会去调用我们自定义的框架内的方法

接下来,打开我们的test_plugin插件项目,执行flutter pub get更新本地依赖

然后增加一个flutter层的测试方法来调用我们在IOS层监听的方法

这样我们的test_plugin插件又多提供了一个方法,用来测试我们在iOS端集成的自定义的Framework

(改三个文件很繁琐,实际开发过程中可以考虑简化到一个文件里来管理)

然后将我们修改好的test_plugin插件重新集成到项目中去,这里为了方便演示,直接用本地依赖的方式来演示功能的测试

然后我们在主界面增加一个测试我们iOS Framework的测试方法

运行之后点击测试,可成功调用iOS 内自己制作的Framewrok内部的方法

注:该Framework编译环境为模拟器环境,并未合并真机环境的Framework,所以如果想运行测试请在模拟器环境下测试,否则项目可能无法正常运行

七、Flutter插件原生平台的缓存机制及更新原理

接下来是重点,我们将对Flutter 插件的缓存机制的深入分析和探讨

首先将仓库的引用方式改为远程引用,然后执行flutter pub get更新本地依赖:

然后我们找到远端引用的test_plugin插件,然后show in finder

可以看到,他是被pub-cache管理缓存在git文件夹下的

查看 pubspec.lock文件,可以看到引用的就是缓存内的插件缓存

这个时候,我们对远端仓库的文件做适当修改,增加一个空方法的

然后更新到远端仓库上,查看远端仓库,发现文件已经成功更新

这个时候,我们在flutter的测试项目中执行

flutter clean 

这个时候可以看到本地的插件文件夹已经被清理掉了

然后我们重新执行

flutter pub get

来拉取插件

这个时候可以看到我们的插件文件夹又回来了,我们的插件也被加载出来了

但是,我们查看文件的时候,发现这并不是最新的文件,虽然我们清理了项目 ,也重新拉了依赖,但是文件却没有从远端更新同步

这是因为Pub会通过版本号来判断我们的插件是否需要更新,如果在pub-cache缓存中有对应版本的文件,则不会去远端重新拉取,所以我们有两种方式来实现远端插件的实时更新

1.每次更新完成之后更换不同的版本号,同时更新Flutter项目中的插件配置

2.彻底清理掉pub-cache中的缓存,重新从远端拉取

我们采取清理缓存的方式来处理,右键插件show in finder

然后删除我们的插件缓存

这个时候你会发现flutter中的插件文件夹也会同步更新

然后删除掉pubspec.lock文件

然后重新执行

flutter pub get

从远端拉取插件缓存到本地,并重新创建pubspec.lock文件,这样才可以彻底更新本地依赖的远端插件

可以看到,插件已经成功与远端仓库同步

(直接删除pubspec.lock文件重新拉取也可以实现项目内的插件更新,但为了避免旧插件缓存被其他项目重复使用,建议直接清理掉pub-cache文件夹内缓存)

至此,相关内容已经介绍完毕,文章中使用的示例文件地址如下,有需要请自取:

制作的test_plugin地址:https://github.com/TheRuningAnt/test_plugin.git

测试的test_project项目地址:GitHub - TheRuningAnt/test_project

同时欢迎交流新的想法~

相关文章:

Flutter插件制作、本地/远程依赖及缓存机制深入剖析(原创-附源码)

Flutter插件在开发Flutter项目的过程中扮演着重要的角色&#xff0c;我们从 ​​​​​​https://pub.dev 上下载添加到项目中的第三方库都是以包或者插件的形式引入到代码中的&#xff0c;这些第三方工具极大的提高了开发效率。 深入的了解插件的制作、发布、工作原理和缓存机…...

Python猜数小游戏

Python 实现的《猜数游戏》 介绍 本文将展示如何使用 Python 编写一个简单的《猜数游戏》。这个游戏将会生成一个1到10之间的随机数&#xff0c;用户有最多三次机会来猜测正确的数字。如果用户猜对了&#xff0c;游戏将结束并显示恭喜信息&#xff1b;如果没有猜对&#xff0…...

--- 用java实现一个计时器 ---

这里的计时器值得是当线程设定的时间过了之后&#xff0c;自动执行该线程的工作 设计 MyTimer 既然是要在指定的时间之后执行任务&#xff0c;那么传入的参数就应该有run方法&#xff08;需要执行的任务&#xff09;&#xff0c;time&#xff08;在多少时间之后执行&#xff…...

OPI4A,目标检测,口罩检测,mnn,YoloX

记得之前&#xff0c;使用了bubbling导师复现的python版yolox&#xff0c;训练了自建的口罩数据集&#xff0c;得到了h5文件&#xff0c;又转换成pb文件&#xff0c;再使用阿里巴巴的MNN&#xff0c;使用它的MNNConvert&#xff0c;转换成mnn文件 最终实现了&#xff0c;在树莓…...

C#与Vue2上传下载Excel文件

1、上传文件流程&#xff1a;先上传文件&#xff0c;上传成功&#xff0c;返回文件名与url&#xff0c;然后再次发起请求保存文件名和url到数据库 前端Vue2代码&#xff1a; 使用element的el-upload组件&#xff0c;action值为后端接收文件接口&#xff0c;headers携带session信…...

Linux(Centos7)安装Mysql/Redis/MinIO

安装Mysql 安装Redis 搜索Redis最先版本所在的在线安装yum库 查看以上两个组件是否是开机自启 安装MinIO 开源的对象存储服务&#xff0c;存储非结构化数据&#xff0c;兼容亚马逊S3协议。 minio --help #查询命令帮助minio --server --help #查询--server帮助minio serve…...

港科夜闻 | 香港科大与微软亚洲研究院签署战略合作备忘录,推动医学健康教育及科研协作...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大与微软亚洲研究院签署战略合作备忘录&#xff0c;推动医学健康教育及科研协作。根据备忘录&#xff0c;双方将结合各自于科研领域的优势&#xff0c;携手推动医学健康领域的交流与合作。合作方向将涵盖人才培训、…...

森林网络部署,工业4G路由器实现林区组网远程监控

在广袤无垠的林区&#xff0c;每一片树叶的摇曳、每一丝空气的流动&#xff0c;都关乎着生态的平衡与安宁。林区监控正以强大的力量&#xff0c;为这片绿色家园筑起一道坚固的防线。 工业 4G 路由器作为林区监控组网的守护者&#xff0c;凭借着卓越的通讯性能&#xff0c;突破…...

ASP.NET Core - 配置系统之自定义配置提供程序

ASP.NET Core - 配置系统之自定义配置提供程序 4. 自定义配置提供程序IConfigurationSourceIConfigurationProvider 4. 自定义配置提供程序 在 .NET Core 配置系统中封装一个配置提供程序关键在于提供相应的 IconfigurationSource 实现和 IConfigurationProvider 接口实现&…...

npm、yarn、pnpm包安装器差异性对比

特性npmyarnpnpm发布年份2010 年发布2016 年发布2017 年发布安装速度较慢&#xff08;旧版本&#xff09;&#xff0c;但自 npm 5 后有所改善较快&#xff0c;尤其是在缓存方面极快&#xff0c;使用硬链接和全局缓存来提高速度包管理模式扁平化依赖&#xff0c;可能会发生重复依…...

正点原子repo放到自己的git服务器

atk-rk3568_android11 导出project-objects对应仓库 .repo/repo/repo list -n > project-object.txt将project-object.txt格式化&#xff0c;并通过gitolite.conf创建对应仓库 atk-rk3568_android11_repo atk-rk3568_android11/RKTools atk-rk3568_android11_repo atk-…...

[MySQL | 二、基本数据类型]

基本数据类型 一、数值类型举例表结构1. 整数类型zerofill属性 与 int(n) 中 n 的关系 2.bit类型3. 小数类型float类型decimal类型 二、字符串类型1. char2. varchar如何选择定长或变长字符串&#xff1f; 3. 日期时间类型(date datetime timestamp)4. enum枚举类型5. set多选类…...

工作记录小点

postman问题 postman 返回404 可以先看看这个模块是否集成到pom文件中 postman 返回200不调debug 请求参数Json有错误请求方式不对Get/Post debug报错连接失败 host文件没copy同事的 2.对应组件的不同服务白名单没添加导致的 host文件刷新 进入 C:\windows\system32\drivers\e…...

在PyCharm中使用Anaconda中的虚拟环境

1、在File菜单中找到Settings 2、Settings中搜索interpreter&#xff0c;找到Python Interpreter&#xff0c;再点击Add 3、选择第一个local interpreter 4、如图&#xff1a; 5、找到anaconda安装位置中的envs文件夹&#xff0c;在里面选择需要添加的python环境&#xff0c;如…...

ansible基础

ansible 1.概述 ansible是基于python语言开发&#xff0c;配置管理和部署应用的工具。批量的配置&#xff0c;部署&#xff0c;管理“上千台”主机 &#xff08;实际一次100台左右&#xff09;&#xff0c;ansible只要在一台主机上就可以对其他主机进行操作。 &#xff08;1&…...

人工智能之深度学习_[2]-PyTorch入门

PyTorch 1.PyTorch简介 1.1 什么是PyTorch PyTorch是一个基于Python的科学计算包 PyTorch安装 pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simplePyTorch一个基于Python语言的深度学习框架&#xff0c;它将数据封装成张量&#xff08;Tensor&#xff09;来进行…...

基于Java的语音陪聊软件——支持聊天私聊-礼物系统-直播系统-缘分匹配-游戏陪玩

丰富的经验、成熟的技术&#xff0c;打造适合当下市场发展的语音交友软件源码。Java 语言凭借其独特的优势&#xff0c;为这款语音陪聊软件的稳健运行和持续发展奠定了坚实基础。它不仅融合了聊天私聊、礼物系统和直播系统等实用且有趣的功能&#xff0c;还创新性地引入了缘分匹…...

Go语言的文件操作

Go语言的文件操作 Go语言是一种开源的编程语言&#xff0c;由谷歌开发&#xff0c;具有简单、高效和并发的特点。在日常开发中&#xff0c;文件操作是一个非常重要且常见的任务。从读取配置文件到写入日志文件&#xff0c;从处理数据到存储结果&#xff0c;文件操作无处不在。…...

php审计1-extract函数变量覆盖

php审计1-extract函数变量覆盖 这是一个关于php审计的栏目&#xff0c;本人也是初学者&#xff0c;分享一下网上的关于php审计的一些知识&#xff0c;学习一下php的语法&#xff0c;顺便记录一下学习过程。 以下是一个关于php审计ctf题 <?php$flagflag.txt; extract($_…...

百度热力图数据原理,处理及论文应用7

目录 0、数据简介0、示例数据1、百度热力图数据日期如何选择1.1、其他实验数据的时间1.2、看日历1.3、看天气 2、百度热力图几天够研究&#xff1f;部分文章统计3、数据原理3.1.1 ** 这个比较重要&#xff0c;后面还会再次出现。核密度的值怎么理解&#xff1f;**3.1.2 Csv->…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...