Flutter 與 iOS 原生項目混編配置

一奢赂、Flutter 安裝 『中文網』

  • 終端執(zhí)行
    flutter doctor -v
    
  • 如果安裝成功會有如下打悠埂:
    OwohAnserdeiMac:Supermakup_Swift pet$ flutter doctor
    Doctor summary (to see all details, run flutter doctor -v):
    [?] Flutter (Channel stable, v1.17.1, on Mac OS X 10.15.5 19F101, locale zh-Hans-CN)
    
    [?] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
    [?] Xcode - develop for iOS and macOS (Xcode 11.3)
    [?] Android Studio (version 3.6)
    [?] VS Code (version 1.47.3)
    [?] Connected device (1 available)
    
    ? No issues found!
    

二、在iOS項目中集成Flutter SDK

  • 1民轴、iOS工程的Enable BitCode需要設置為NO攻柠,因為Flutter 混合開發(fā)不支持。

  • 2后裸、創(chuàng)建 flutter module:

    • cd 到項目文件的同級目錄下瑰钮;
    • 執(zhí)行命令:(flutter_module: 文件名稱,可自定義)
      flutter create -t module flutter_module
      
    • 如果輸出如下錯誤:
      Got socket error trying to find package cupertino_icons at https://pub.dartlang.org.
      
    • 可執(zhí)行以下命令解決:
      /// 配置鏡像
      export PUB_HOSTED_URL=https://pub.flutter-io.cn
      export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
      
    • 若輸出如下微驶,表示成功浪谴,可在項目文件的同級目錄看到新生成的文件(flutter_module):
      OwohAnserdeiMac:Supermakup_Swift pet$ flutter create -t module myfluttermodule
      Creating project myfluttermodule...
      myfluttermodule/test/widget_test.dart (created)
      myfluttermodule/myfluttermodule.iml (created)
      myfluttermodule/.gitignore (created)
      myfluttermodule/.metadata (created)
      myfluttermodule/pubspec.yaml (created)
      myfluttermodule/README.md (created)
      myfluttermodule/lib/main.dart (created)
      myfluttermodule/myfluttermodule_android.iml (created)
      myfluttermodule/.idea/libraries/Flutter_for_Android.xml (created)
      myfluttermodule/.idea/libraries/Dart_SDK.xml (created)
      myfluttermodule/.idea/modules.xml (created)
      myfluttermodule/.idea/workspace.xml (created)
      Running "flutter pub get" in myfluttermodule...                     1.0s
      Wrote 12 files.
      
      All done!
      Your module code is in myfluttermodule/lib/main.dart.
      
  • 3、通過cocoapods添加依賴

    • 在項目的Podfile文件中添加如下代碼:
      #其中flutter_application_path為flutter模塊相對于podfile文件的位置因苹。
      flutter_application_path = './../flutter_module/'
      eval(File.read(File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')), binding)
      
    • 更新pods
      pod install
      
  • 4苟耻、添加腳本

    Xcode -> Target -> Build Phase -> New Run Script Phase;

    "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" build
    "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" embed
    
  • 5、編譯項目

    • 編譯成功扶檐,執(zhí)行腳本后會在項目的根目錄中生成一個Flutter文件凶杖,里面包含:
      Flutter.framework
      Flutter.podspec
      
    • 編譯失敗
      • 如果報如下錯誤:
        /bin/sh: /packages/flutter_tools/bin/xcode_backend.sh: No such file or directory
        
      • 需指定FLUTTER_ROOT路徑,在 flutter_module/.ios(隱藏文件)/Flutter/Generated.xcconfig 路徑下找到Generated.xcconfig 文件蘸秘,打開可以看到:
        FLUTTER_ROOT=/Users/pet/Desktop/Flutter/flutter
        FLUTTER_APPLICATION_PATH=/Users/pet/Desktop/超級美/Supermakup_Swift/flutter_module
        FLUTTER_TARGET=lib/main.dart
        FLUTTER_BUILD_DIR=build
        SYMROOT=${SOURCE_ROOT}/../build/ios
        OTHER_LDFLAGS=$(inherited) -framework Flutter
        FLUTTER_BUILD_NAME=1.0.0
        FLUTTER_BUILD_NUMBER=1
        
      • 在xcode中添加如下配置:
        xcode -> target -> build setting - User-Defined 中添加:
        FLUTTER_ROOT=/Users/pet/Desktop/Flutter/flutter
        FLUTTER_APPLICATION_PATH=/Users/pet/Desktop/超級美/Supermakup_Swift/flutter_module
        
  • 6官卡、將Flutter添加到工程中

    • 將項目根目錄下的Flutter文件添加到工程中蝗茁,將Flutter.framework 添加到Xcode -> Target -> General -> Framewroks,Libraries,and Embeded Content 下醋虏。
  • 7、引入Flutter SDK 頭文件和使用

    #import <Flutter/Flutter.h>
    

三哮翘、入過的坑:

1. 第一次加載flutter頁面顯示ios啟動圖颈嚼;

需要注意的是iOS原生跳轉flutter時,第一次跳轉會異步渲染flutter環(huán)境饭寺,因此阻课,F(xiàn)lutterViewController實例有個splashScreenView屬性叫挟,防止用戶在打開flutter頁面時會有一個中間的空檔,如果我們沒有設置此屬性限煞,iOS默認將app應用的LaunchStoryboard設置為此屬性的值抹恳,默認可能設置成功也可能設置失敗,取決于你APP的啟動圖片是否是用LaunchStoryboard來設置的署驻,所以奋献,沒有特殊情況,最好手動設置一下此屬性旺上;

let vc = CJMFlutterViewController.init()
vc.splashScreenView = {
    let view = UIView.init(frame: UIScreen.main.bounds)
    view.backgroundColor = kBackgroundColor
    return view
}()

2. FlutterViewController 內存泄露

原因出在創(chuàng)建channel時瓶蚂,造成了循環(huán)引用,導致flutterViewController不釋放宣吱∏哉猓可以新建一個控制器繼承FlutterViewController,然后重寫 didMove(toParent parent: UIViewController?) 方法

override func didMove(toParent parent: UIViewController?) {
      super.didMove(toParent: parent)
      if parent == nil {
          DispatchQueue.main.async {
              self.engine?.viewController = nil     // 必須先釋放 engine 持有的 flutterViewController征候,否則會crash
              self.engine?.destroyContext()         // 再銷毀 engine
          }
      }
  }
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末杭攻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子倍奢,更是在濱河造成了極大的恐慌朴上,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卒煞,死亡現(xiàn)場離奇詭異痪宰,居然都是意外死亡,警方通過查閱死者的電腦和手機畔裕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門衣撬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人扮饶,你說我怎么就攤上這事具练。” “怎么了甜无?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵扛点,是天一觀的道長。 經常有香客問我岂丘,道長陵究,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任奥帘,我火速辦了婚禮铜邮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己松蒜,他們只是感情好扔茅,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著秸苗,像睡著了一般召娜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惊楼,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天萤晴,我揣著相機與錄音,去河邊找鬼胁后。 笑死店读,一個胖子當著我的面吹牛,可吹牛的內容都是我干的攀芯。 我是一名探鬼主播屯断,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼侣诺!你這毒婦竟也來了殖演?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤年鸳,失蹤者是張志新(化名)和其女友劉穎趴久,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搔确,經...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡祠饺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年乓旗,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡懊渡,死狀恐怖初肉,靈堂內的尸體忽然破棺而出析校,到底是詐尸還是另有隱情皿哨,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布机隙,位于F島的核電站蜘拉,受9級特大地震影響,放射性物質發(fā)生泄漏有鹿。R本人自食惡果不足惜旭旭,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望印颤。 院中可真熱鬧您机,春花似錦穿肄、人聲如沸年局。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矢否。三九已至仲闽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間僵朗,已是汗流浹背赖欣。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留验庙,地道東北人顶吮。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像粪薛,于是被迫代替她去往敵國和親悴了。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355