Flutter
已經融入工程有一段時間了,因爲團隊人數較少,因此一直沒有管和原有工程解依賴的問題,今天有時間正好把這個問題給搞了。android
首先,直接忽略上一篇《接入現有iOS項目》的全部步驟,直接建立flutter_module
工程ios
flutter create flutter_module
注:
flutter create flutter_module
和flutter create -t module my_flutter
區別在於帶module
參數,建立出來的工程會把輔助用的android
,ios
工程給隱藏掉,咱們這裏要涉及打包以及修改配置,就不須要帶module
參數了git
其次,弄明白一件事官方wiki,裏面用的兩個腳本podhelper.rb
和xcode_backend.sh
分別在Podfile
和Build 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
Flutter.framework
(Flutter引擎),以及Flutter
的插件註冊表FlutterPluginRegistrant
(建立的工程中GeneratedPluginRegistrant.{h,m}
文件中).flutter-plugins
的依賴Generated.xcconfig
配置,這裏面放的是Flutter
要用的環境變量(如:xcode_backend.sh
開頭就要用的$FLUTTER_ROOT
)這裏面最重要的就是Flutter.framework
ui
2.xcode_backend.sh插件
這個腳本本來是放在Build Phases
,在Debug
和Release
模式下分別會產出對應環境的Flutter
產物(Flutter
有Debug
,Profile
,Release
三個模式)。而且裏面還有一句代碼是:code
RunCommand cp -r -- "${app_framework}" "${derived_dir}"
咱們如今把flutter
模塊獨立了,因而在Debug
的時候執行flutter run
或者打包執行flutter build ios
都會在ios/Flutter文件夾下產生一些文件,其中App.framework
和flutter_assets
是咱們最關心的。
也就是說xcode_backend.sh
的做用是:
在Debug
和Release
下構建出對應的Flutter
產物,App.framework
,flutter_assets
(App.framework
就是咱們在lib下面寫的Dart代碼,flutter_assets
就是咱們資源)
把上面的產物拷貝到App包裏
那麼咱們也得出了相應的結論,要解除依賴,就是須要把關鍵的三個文件拆出來就能夠了:
Flutter.framework
App.framework
flutter_assets
固然若是有FlutterPlugin
則還須要FlutterPluginRegistrant
,這個咱們後面講。
把Flutter.framework
、App.framework
、flutter_assets
三個文件拷貝到這個工程。
注:必定要對應好
Xcode
和Flutter
的模式,若是Xcode
是Debug
,那麼須要Debug
模式的Flutter
產物,即:flutter run
出來的App.framework
和flutter_assets
,Xcode
是Release
則須要flutter build ios
出來的App.framework
和flutter_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
修改工程下的Podfile
:
pod "FlutterModule", :path => "../flutter_product"
注:我這裏直接用的本地路徑引入的(主要仍是懶),團隊開發應該是放在本身的私有pod庫上。
至此,依賴就解決了,Native
同窗不須要關心Flutter
模塊,也不須要搭建Flutter
環境,就能夠開發了。而負責Flutter
模塊的同窗也能夠經過獨立的工程單獨開發,固然在大型團隊開發過程當中還有不少事情要作,這裏只是第一步,後續把Plugin
項目完成後出一篇完整文章。