Flutter踩坑日记:解除依赖

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

1、分析

首先,直接忽略上一篇《接入现有iOS项目》的全部步骤,直接建立flutter_module工程ios

flutter create flutter_module

注:flutter create flutter_moduleflutter create -t module my_flutter区别在于带module参数,建立出来的工程会把辅助用的androidios工程给隐藏掉,咱们这里要涉及打包以及修改配置,就不须要带module参数了git

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

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

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

1.podhelper.rbxcode

这个脚本主要作了三件事:app

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

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

2.xcode_backend.sh插件

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

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,这个咱们后面讲。

2、建立产物工程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" => "tanglei@doctorwork.com" }

  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

3、经过Pod引入Xcode工程

修改工程下的Podfile

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

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

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

相关文章
相关标签/搜索