因项目需求,公司的Flutter项目使用了百度地图来实现地图相关功能。然而百度地图的坑不是一般的多,主要体现和framework(含Swift)库的问题,包括在库的导入、编译、打包都存在不少问题。该篇文章主要解决利用Vscode 编译问题
一. 库的导入问题,相关配置可查看百度地图官网
- 根据官网的提示在pubspec.yaml文件添加插件之后,直接运行flutter run 指令,会出现库相互依赖的问题
依赖问题 解决方案:
打开iOS的Podfile文件,把文件底部的注释掉,然后重新运行flutter run 指令即可解决问题
此处是为了让下载的包变成.a的静态库,官方文档并没有提及相关问题
提及其他问题先显示以下两个图,就是注释use_frameworks之后在项目中的区别,后面的问题需要关注这两个库的格式
注释前的是.framework库


二.如果引入其他只能Pod .frameworks库的时候,就会引起编译问题,此处用flutter_inappwebview 为例
如果在注释掉Podfile 文件中的use_frameworks!执行flutter run 就会出现该问题
解决思路
-
光看这个问题可能不知道从哪里入手,所以就打开iOS项目看看报了什么错误(如图所示)
发现提示找不到flutter_inappwebview/flutter_inappwebview-Swift.h 按以前的经验,应该就是配置没有配置好该模块的同名-swift.h文件,可是如果到项目配置中查看,会发现配置是没有问题的
image.png
-
在多次尝试修改配置仍然没有解决以上问题的情况下,只能首先让这个库能正常编译之后再去查找原因,所以我重新创建一个新项目,仅添加flutter_inappwebview这个插件试试编译能否成功
可以发现单独添加这个插件,项目是可以编译成功的
- 然后我就直接在新项目中添加了百度地图的插件
,然后执行flutter run 惊奇地发现编译通过了,但是为什么呢,为什么原来编译不能通过,后面的却能通过呢
编译通过
-
在想不通的情况下,我继续尝试再次新建项目,添加百度地图以及flutter_inappwebview插件,在多次尝试之后发现,当我执行flutter run 的时候,会创建一个build的文件夹,里面存放的就是编译相关的一些文件,然后发现只有如图所示flutter_inappwebview文件夹内的文件都存在的时候,百度地图和flutter_inappwebview两个插件就可以共存编译通过
此处为成功编译的文件
-
然后我再次尝试把项目搞成编译不成功的情况,就如下图所示
发现此处的文件少了很多
- 细心观察成功与不成功,可以发现实际上是因为库并没有下载成功,这是为什么呢,后来想想可能是因为修改了
导致的,然后就尝试着先把Podfile 的修改还原,使得flutter_inappwebview插件能正常编译,然后再看看该文件夹内的变化,多了一个flutter_inappwebview.framework库
可以观察到成功编译此处文件夹内就存在,flutter_inappwebview.framework的库
-
然后再次把百度地图相关的插件添加,并修改Podfile,执行flutter run指令观察,会发现编译通过
问题已经很明确了
总结
- 因为flutter_inappwebview,只有在use_frameworks!不被注释的情况下,才能正常下载flutter_inappwebview.framework的库,而不注释的情况下就无法下载百度地图相关的库。
- 所以解决的方法就是先添加flutter_inappwebview,再进行编译,使得flutter_inappwebview.framework能正常下载下来,然后再添加百度地图的插件,这样的话会把百度地图的库下载下来并且会根据flutter_inappwebview.framework生成对应的.a文件,使得编译通过
- 此处仅解决了利用Vscode编译的问题,但是如果你使用Xcode进行编译,可以发现仍然会报相同的错误,解决方案请关注百度地图.a和.framwork冲突(二)
网友评论