微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Flutter踩坑日记:解除依赖

Flutter已经融入工程有一段时间了,由于团队人数较少,所以一直没有管和原有工程解依赖的问题,今天有时间正好把这个问题给搞了。

一、分析

首先,直接忽略上一篇《接入现有iOS项目》的所有步骤,直接创建Flutter_module工程

Flutter create Flutter_module

注:Flutter create Flutter_moduleFlutter create -t module my_Flutter区别在于带module参数,创建出来的工程会把辅助用的androidios工程给隐藏掉,我们这里要涉及打包以及修改配置,就不需要带module参数了

其次,弄明白一件事官方wiki,里面用的两个脚本podhelper.rbxcode_backend.sh分别在PodfileBuild Phases里面

Flutter_application_path = '../my_Flutter/'
eval(File.read(File.join(Flutter_application_path,'.ios','Flutter','podhelper.rb')),binding)
"$FlutteR_ROOT/packages/Flutter_tools/bin/xcode_backend.sh" build
"$FlutteR_ROOT/packages/Flutter_tools/bin/xcode_backend.sh" embed

这两个脚本的作用时什么呢?

1.podhelper.rb

这个脚本主要做了三件事:

  1. 通过Pod引入Flutter.frameworkFlutter引擎),以及Flutter插件注册FlutterPluginRegistrant(创建的工程中GeneratedpluginRegistrant.{h,m}文件中)
  2. 引入.Flutter-plugins的依赖
  3. 导入Generated.xcconfig配置,这里面放的是Flutter要用的环境变量(如:xcode_backend.sh开头就要用的$FlutteR_ROOT

这里面最重要的就是Flutter.framework

2.xcode_backend.sh

这个脚本原本是放在Build Phases,在DebugRelease模式下分别会产出对应环境的Flutter产物(FlutterDebugProfileRelease三个模式)。并且里面还有一句代码是:

runcommand cp -r -- "${app_framework}" "${derived_dir}"

我们现在把Flutter模块独立了,于是在Debug的时候执行Flutter run或者打包执行Flutter build ios都会在ios/Flutter文件夹下产生一些文件,其中App.frameworkFlutter_assets是我们最关心的。

也就是说xcode_backend.sh的作用是:

DebugRelease下构建出对应的Flutter产物,App.frameworkFlutter_assetsApp.framework就是我们在lib下面写的Dart代码Flutter_assets就是我们资源)
把上面的产物拷贝到App包里

那么我们也得出了相应的结论,要解除依赖,就是需要把关键的三个文件拆出来就可以了:

  1. Flutter.framework
  2. App.framework
  3. Flutter_assets

当然如果有FlutterPlugin则还需要FlutterPluginRegistrant,这个我们后面讲。

二、创建产物工程Flutter_product

Flutter.frameworkApp.frameworkFlutter_assets三个文件拷贝到这个工程。

注:一定要对应好XcodeFlutter的模式,如果XcodeDebug,那么需要Debug模式的Flutter产物,即:Flutter run出来的App.frameworkFlutter_assetsXcodeRelease则需要Flutter build ios出来的App.frameworkFlutter_assets。这个后续可以写个shell脚本来搞定。

编写**podspec**文件

Pod::Spec.new do |s|

  s.name         = "FlutterModule"
  s.version      = "0.0.1"
  s.summary      = "A short description of FlutterModule."

  s.description  = "FlutterModule"

  s.homepage     = "http://EXAMPLE/FlutterModule"

  s.license      = "MIT"
  s.author             = { "goingta" => "[email protected]" }

  s.source       = { :git => "",:tag => "#{s.version}" }

  #s.source_files = 'Classes','Classes/**/*.{h,m}'
  s.vendored_frameworks = ['Module/App.framework','Module/Flutter.framework']
  s.resource = ['Module/Flutter_assets']

end

三、通过Pod引入Xcode工程

修改工程下的Podfile

pod "FlutterModule",:path => "../Flutter_product"

注:我这里直接用的本地路径引入的(主要还是懒),团队开发应该是放在自己的私有pod库上。

至此,依赖就解决了,Native同学不需要关心Flutter模块,也不需要搭建Flutter环境,就可以开发了。而负责Flutter模块的同学也可以通过独立的工程单独开发,当然在大型团队开发过程中还有很多事情要做,这里只是第一步,后续把Plugin项目完成后出一篇完整文章

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐