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

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

1.工程目錄結(jié)構(gòu)
因?yàn)槭强缙脚_(tái)開(kāi)發(fā),通常有三個(gè)工程:iOS,安卓,flutter.由于本人是iOS開(kāi)發(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包命名要求是必須小寫(xiě),并且單詞間用 _ 隔開(kāi).不然很可能創(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打開(kāi)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)鍵盤(pán)點(diǎn)擊”r”,即可hot reload成功,title已經(jīng)被成功修改.

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,412評(píng)論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,514評(píng)論 3 416
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,373評(píng)論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,975評(píng)論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,743評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,199評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,262評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,414評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,951評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,780評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,983評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,527評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,218評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,649評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,889評(píng)論 1 286
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,673評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,967評(píng)論 2 374