美文网首页Flutter
flutter 插件的坑都在这里

flutter 插件的坑都在这里

作者: 微风_10a5 | 来源:发表于2020-08-12 10:12 被阅读0次

首先声明一点,flutter的插件已经有不少了,官方的插件,去这里找https://github.com/flutter/plugins
第三方的插件,去这里找https://pub.dev/, (这个网站有时候打不开,感觉应该是服务器的问题,请耐心多刷新几次喽),

但是难免有时候还是要自己去写插件,俗称自定义插件,才能满足自己项目的需要.
比方说,在原生工程里面是用 合作公司的SDK开发了一个视频模块 (SDK是封装好的头文件和一些.a静态库), 假如现在flutter工程里面也想要这个视频模块,那怎么办,这个时候就需要写插件了,写视频的插件了. 当然各位有更好的办法解决此需求,麻烦请告知我喽~~

言归正传,我们还是回到怎么写自定义插件.我决定从简单到复杂来一一介绍

简单的--->插件里面只调用到原生自带的api,

当我们新建一个插件工程的时候,官方就给我们提供了一个示例, 获取手机的版本号.这个示例就是属于此类. 只用原生自带的一些api,就可以完成.

点击Android Studio 新建一个插件工程,


image.png

然后就是下一步,下一步的事情了,建完以后发现有问题,打不开原生工程 翻车了~~


image.png

注意观察哦,没有android,也没有iOS相关的东西;还有一点就是 右键没法用xcode打开了;


image.png

来来来,现在我们来看一下flutter 1.20 版本之前的版本建完以后是这样的


image.png

右键是可以用xocode打开原生工程的


image.png

现在我们来填坑

我们还是按官方文档来解决此坑吧,
官方地址:https://flutter.dev/docs/development/packages-and-plugins/developing-packages#plugin-platforms

其中这个地方有提到怎么创建插件工程


image.png

其中插件工程名为hello. 现在我们要创建一个工程PlugTest1,所以用下面的命令
1.打开终端,cd 到你要的位置,比喻我就放到桌面

cd Desktop/

2.把上面的语句改一下

flutter create --org com.example --template=plugin --platforms=android,ios -i objc plugTest1

其中 参数 objc 表示iOS工程将会是用Objective-C语言来编写代码,对应安卓的是java;
同理如果把objc 换成swift,表示iOS工程将会是用swift语言来编写代码,对应安卓的是kotlin;

3.接着运行

flutter run

就会正常的跑起来.至此新建一个插件工程的坑填完(此坑是flutter 升级为1.20后才会出现的).
如下图的路径,就能找到插件实现的核心代码(iOS Android)


image.png
回到正题

此简单插件实现,只调用到原生自带的api
iOS


image.png

Android

image.png

中等---->还会用到一些第三方的文件或者说是用到了第三方库

例如我之前写的一篇文章,关于实现udp扫描的插件,https://www.jianshu.com/p/803660ad39de
就是属于此类,有兴趣的可以看看上面链接的那篇文章.
不过在此 我还是从零开始带着大家看看,首先用上面的方法新建一个叫 plugUdp的插件

cd Desktop/
flutter create --org com.example --template=plugin --platforms=android,ios -i objc plugUdp
flutter run

建完之后是这样的,可以正常运行起来


image.png

这里我以iOS为例,同样的右键,用xcode打开原工程


image.png

想在xcode里面找到PlugUdpPlugin.h,PlugUdpPlugin.m还是不容易的,路径比较深的,这里我为了方便大家,把路径的图留下来了


image.png
回到正题

写udp插件,我是用到了GCDAsyncSocket这个库在iOS里面处理socket相关的比较容易,他有几个文件,我们现在要把它放在哪里呢,


image.png

经过多番测试是放在Classes里面是可以的.可以正常用起来

image.png

但是flutter 升级为1.20后,又不行了

我们来填坑 (重点就在这里,后面复杂一点的配置也是以此为基础的)

1.回到android studio下plugUdp插件工程, 在iOS文件夹下面新建一个文件夹,比喻Frameworks,把需要的文件放在Frameworks文件夹里面


image.png

2.配置podspec文件,把.h .m文件路径配置进去


sg

3.打开终端,cd到工程目录下的plugUdp/example/ios下,里面有podfile文件

cd /Users/XXXXXX/Desktop/plugUdp/example/ios

4.在终端 安装一下

pod install

5.再右键用xcode打开原生工程


image.png

你会发现多了一个叫Frameworks的文件夹,并且里面有相应的文件.
在PlugUdpPlugin.h 试着引入头文件,是正常,并且使用它,
在PlugUdpPlugin.m调用它里面的方法,也是正常的.


image.png

此到大功告成, 坑已填完.

有难度--->插件里面用到 第三方封装好的sdk,(有framework,有.h头文件,有.a静态库等)

怎么在插件里面导入第三方封装好的Framework,并且能正常使用它,还有些难度的.说得更清楚一些就是怎么配置podspec文件.
关于怎么配置podspec文件 我们再来一个实例

1.新建一个plugvideo的插件(前面已经多次用到了,不再赘述),用android studio打开插件工程;
2.在ios文件夹下,新建一个frameworks文件夹,再把.a /.framework文件放进去,把.h /.m文件放到Classes文件夹(如下图第一图)
3.配置podspec(如下图第一图)
4.找到plugvideo插件工程目录下的podfile文件,进行pod install(前面有提到,可以回头看上面)
5.右键用xcode打开原生工程,
6.验证一下是否正常(如下图第二图)


image.png img01.png

最后附上podspec配置遵循的规则

Pod::Spec.new do |s|
s.name         = "XXXSDK"
s.version      = "1.0.0"
s.summary      = "这是一个SDK"
s.description  = "这是一个SDK 一定要比summary长."
s.homepage     = "https://github.com/xxxx/XXXSDK"
s.license      = { :type => "MIT", :file => "LICENSE" }
s.author       = { "作者" => "123456@qq.com" }
s.platform     = :ios, "8.0"
 
#  When using multiple platforms ios部署版本
# s.ios.deployment_target = "5.0"
# s.osx.deployment_target = "10.7"
 
#1 git commit -m =>"13287dd",讲pod版本与git仓库中的某一次提交绑定
#s.source = { :git => "https://github.com/xxxx/XXXSDK", :commit => "13287dd" }
#2 将这个Pod版本与Git仓库中某个版本的comit绑定 
#s.source = { :git => "https://github.com/xxxx/XXXSDK", :tag => 1.0.0 }
#3 将这个Pod版本与Git仓库中相同版本的comit绑定
#s.source = { :git => "https://github.com/xxxx/XXXSDK", :tag => s.version }
s.source       = { :git => "https://github.com/xxxx/XXXSDK.git", :tag => "v#{s.version}" }
s.source_files  = "XXXSDK", "XXXSDK/openSource/*.{h,m}"
s.vendored_frameworks = 'XXXSDK/lib/XXXSDK.framework'
s.resources          = "XXXSDK/resource/resource.bundle"
s.framework  = "UIKit"
#s.resource    = "XXXSDK/resource/resource.jpg"
#s.frameworks = "SomeFramework", "AnotherFramework"
#引用libxml2.lib和libz.lib、tbd ,去掉头尾的lib
# s.library   = "z"
# s.libraries = "z", "xml2"
#s.vendored_libraries = 'XXXSDK/lib/XXXSDK.a'
s.requires_arc = true
# s.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" }
# s.dependency "JSONKit", "~> 1.4" s.dependency = 'AFNetworking', '~> 2.3' s.dependency = 'SDWebImage'
# 创建子库
#s.subspec 'Components' do |ss|
#ss.source_files = 'YDKit/Components/*/.{h,m}'
#end
end
 
 
 
###以下是上面代码的功能注解
 
s.name: 
名称
pod search 搜索的关键词,一定要和.podspec的名称一样,否则报错
s.version: 
版本号
s.ios.deployment_target: 
支持的pod最低版本
s.summary: 
简介
s.homepage: 
项目主页地址
s.license: 
开源协议(创建github库的时候选择的)
s.author: 
作者信息(这里随便谢谢也可以通过)
s.social_media_url: 
社交网址
s.source: 
项目的地址
s.source_files: 
需要包含的源文件
s.resource: 
资源文件,单个
s.resources: 
资源文件(含bundle)
s.vendored_frameworks: 
包含的framework,也就是我们自己制作的pod
s.requires_arc: 
是否支持ARC
s.dependency: 
依赖库,不能依赖未发布的库.如AFNetWorking
s.description: 
描述,字数要比s.summary长
s.screenshots: 
截图
s.exclude_files: 
隐藏的文件
s.public_header_files: 
公开的头文件
s.framework: 
所需的framework,单个
s.frameworks: 
所需的framework,多个用逗号隔开
s.library 
引用的静态库
s.libraries 
引用的静态库,多个用逗号隔开
s.vendored_libraries: 
引用自己生成的.a
s.vendored_frameworks: 
引用自己生成的.framework,多个用逗号隔开
s.dependency: 
依赖的库
s.ios.deployment_target 
iOS部署版本
 

结尾

关于插件这块,因为涉及的东西比较多,所以本来就是有点复杂.遇到坑后,就感觉更难了,这个时候,就需要耐心啦.就像看这篇文章一样,要有耐心把它看完,一边看,一边动手做,多练几次,相信会有收获的~ 祝君好运~~~
如果觉得有点帮助,请点赞加关注哦~

相关文章

网友评论

    本文标题:flutter 插件的坑都在这里

    本文链接:https://www.haomeiwen.com/subject/hgyydktx.html