[Flutter][iOS]混合開發(fā)初體驗(yàn)

通常我們面對(duì)的需求不是直接用flutter開發(fā)一個(gè)新app,而是希望在已有的項(xiàng)目中嵌入flutter,開發(fā)部分頁(yè)面,根據(jù)開發(fā)情況逐漸進(jìn)行過度.下面介紹一下iOS端如何與Flutter進(jìn)行混編.

1.工程目錄結(jié)構(gòu)
因?yàn)槭强缙脚_(tái)開發(fā),通常有三個(gè)工程:iOS,安卓,flutter.由于本人是iOS開發(fā),所以這里只列舉iOS.目錄結(jié)構(gòu)如下:

-Flutter_iOS_App
-flutter_app
官方建議我們能將三個(gè)項(xiàng)目都放在同級(jí)目錄中,另外flutter目前不能很好的支持bitcode,所以iOS工程中需要關(guān)閉.

2.創(chuàng)建flutter模塊
在創(chuàng)建iOS項(xiàng)目后,需要?jiǎng)?chuàng)建對(duì)應(yīng)的flutter模塊.
進(jìn)入到和iOS項(xiàng)目同級(jí)目錄后,運(yùn)行命令:

flutter create -t module flutter_app
// 這里有個(gè)注意點(diǎn),官方對(duì)于flutter包命名要求是必須小寫,并且單詞間用 _ 隔開.不然很可能創(chuàng)建失敗.

3.配置iOS項(xiàng)目的config文件
總共有如下三個(gè)文件:

-Flutter.xcconfig:指向flutter內(nèi)部的Generated.xcconfig文件,主要是一些基礎(chǔ)配置
-Debug.xcconfig:Debug環(huán)境配置文件
-Release.xcconfig:Release環(huán)境配置文件

Flutter.xcconfig文件內(nèi)容:

// xxxxxxx用flutter的項(xiàng)目名稱代替
#include "../xxxxxxx/.ios/Flutter/Generated.xcconfig"

Debug.xcconfig文件內(nèi)容:

#include "Flutter.xcconfig"
// 如果使用了Cocoapods难捌,那么需要引入 cocoapods 的config文件,xxxxxxx用iOS工程名代替
#include "Pods/Target Support Files/Pods-xxxxxxx/Pods-xxxxxxx.debug.xcconfig"

Release.xcconfig文件內(nèi)容:

#include "Flutter.xcconfig"
// 如果使用了Cocoapods垢夹,那么需要引入 cocoapods 的config文件,xxxxxxx用iOS工程名代替
#include "Pods/Target Support Files/Pods-xxxxxxx/Pods-xxxxxxx.release.xcconfig"

4.配置config到iOS工程中
如圖:

5.設(shè)置flutter腳本
在iOS工程內(nèi)的target中,找到Build Phases 添加flutter執(zhí)行腳本,會(huì)生成一個(gè)engine文件夾和app.framework:

"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" build

這段腳本最好放在系統(tǒng)腳本的后面,運(yùn)行完這段腳本后我們發(fā)現(xiàn)生成的兩個(gè)framework在flutter項(xiàng)目?jī)?nèi),所以這時(shí)候需要修改一下xcode_backend.sh腳本,讓它們?cè)趇OS工程內(nèi).
找到腳本,注釋掉如下代碼:

  local derived_dir="${SOURCE_ROOT}/Flutter"
  #  if [[ -e "${project_path}/.ios" ]]; then
  #    derived_dir="${project_path}/.ios/Flutter"
  #  fi
  RunCommand mkdir -p -- "$derived_dir"
  AssertExists "$derived_dir"

6.將生成的文件和framework拖入工程內(nèi),
將App.framework 和Flutter.framework添加到Embedded Binaries中.

7.改造Appledegate文件
如下代碼:

// .h
#import <UIKit/UIKit.h>
#import <Flutter/Flutter.h>
@interface AppDelegate : FlutterAppDelegate <UIApplicationDelegate,FlutterAppLifeCycleProvider>

// .m
@implementation AppDelegate {
    FlutterPluginAppLifeCycleDelegate *_lifeCycleDelegate;
}

- (instancetype)init {
    if (self = [super init]) {
        _lifeCycleDelegate = [[FlutterPluginAppLifeCycleDelegate alloc] init];
    }
    return self;
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    return [_lifeCycleDelegate application:application didFinishLaunchingWithOptions:launchOptions];;
}
// 如果有用到其他生命周期方法,按照上面的示例替換就行了
@end

8.本地跳轉(zhuǎn)進(jìn)入flutter頁(yè)面

- (IBAction)push:(id)sender {
    FlutterViewController *vc = [[FlutterViewController alloc] initWithProject:nil nibName:nil bundle:nil];
    vc.navigationItem.title = @"first flutter app";
    [self.navigationController pushViewController:vc animated:YES];
}

此時(shí)用vscode打開flutter工程,然后終端cd到flutter工程內(nèi),執(zhí)行:

flutter attach // 等待Xcode運(yùn)行

運(yùn)行xcode,成功后點(diǎn)擊button,跳轉(zhuǎn)進(jìn)入flutter界面.
此時(shí)進(jìn)入flutter項(xiàng)目,修改main.dart的title,然后在終端內(nèi)鍵盤點(diǎn)擊”r”,即可hot reload成功,title已經(jīng)被成功修改.

好了,到此基本能明白混編是怎么一會(huì)兒事兒了,下一篇將要介紹,iOS和Flutter的交互過程.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末弹灭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蛋铆,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盏求,死亡現(xiàn)場(chǎng)離奇詭異薄嫡,居然都是意外死亡驹溃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門添吗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事腹尖。” “怎么了伐脖?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵热幔,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我讼庇,道長(zhǎng)绎巨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任蠕啄,我火速辦了婚禮场勤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘歼跟。我一直安慰自己和媳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布哈街。 她就那樣靜靜地躺著留瞳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪骚秦。 梳的紋絲不亂的頭發(fā)上她倘,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天璧微,我揣著相機(jī)與錄音,去河邊找鬼硬梁。 笑死前硫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的荧止。 我是一名探鬼主播屹电,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼跃巡!你這毒婦竟也來了嗤详?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤瓷炮,失蹤者是張志新(化名)和其女友劉穎葱色,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體娘香,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡苍狰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了烘绽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淋昭。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖安接,靈堂內(nèi)的尸體忽然破棺而出翔忽,到底是詐尸還是另有隱情,我是刑警寧澤盏檐,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布歇式,位于F島的核電站,受9級(jí)特大地震影響胡野,放射性物質(zhì)發(fā)生泄漏材失。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一硫豆、第九天 我趴在偏房一處隱蔽的房頂上張望龙巨。 院中可真熱鬧,春花似錦熊响、人聲如沸旨别。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秸弛。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間胆屿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工偶宫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留非迹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓纯趋,卻偏偏與公主長(zhǎng)得像憎兽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吵冒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353