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項目完成後出一篇完整文章。

相關文章
相關標籤/搜索