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.framework(Flutter引擎),以及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" => "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

三、通過Pod引入Xcode工程

修改工程下的Podfile

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

注:我這里直接用的本地路徑引入的(主要還是懶),團隊開發應該是放在自己的私有pod庫上。

至此,依賴就解決了,Native同學不需要關心Flutter模塊,也不需要搭建Flutter環境,就可以開發了。而負責Flutter模塊的同學也可以通過獨立的工程單獨開發,當然在大型團隊開發過程中還有很多事情要做,這里只是第一步,后續把Plugin項目完成后出一篇完整文章。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM