Flutter工程結(jié)構(gòu)


一、工程目錄

AndroidStudio創(chuàng)建一個(gè)Flutter項(xiàng)目氧骤,F(xiàn)lutter工程的目錄結(jié)構(gòu)和普通Android工程是不同的民珍,它是Google的跨平臺(tái)UI框架,包含android和ios目錄览爵。

AndroidStudio創(chuàng)建Flutter工程目錄
目錄結(jié)構(gòu)

android目錄,android子工程镇饮,和普通android工程類似蜓竹,包含app目錄,gradle目錄和gradle配置储藐。
ios目錄俱济,ios子工程。
lib目錄钙勃,dart源文件蛛碌。
pubspec.yaml文件,F(xiàn)lutter配置文件辖源,添加dart包packages依賴和包名蔚携。

Flutter工程android目錄結(jié)構(gòu)

二、android工程

1克饶,頂級(jí)構(gòu)建settings.gradle文件酝蜒,包含構(gòu)建模塊,app主模塊矾湃,動(dòng)態(tài)include插件模塊亡脑。

include ':app'
//android工程目錄的父目錄,即example目錄
def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
//讀取flutter工程根目錄下.flutter-plugin文件
def plugins = new Properties()
def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
if (pluginsFile.exists()) {
    pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
}
//遍歷.flutter-plugin中每項(xiàng)插件邀跃,include引入每項(xiàng)插件模塊
plugins.each { name, path ->
    def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
    include ":$name"
    project(":$name").projectDir = pluginDirectory
}

普通Flutter工程(非Flutter插件工程)霉咨,不存在.flutter-plugins文件,可以只關(guān)注include :app引入拍屑,忽略settings.gradle文件其他內(nèi)容途戒。
2,頂級(jí)構(gòu)建build.gradle文件僵驰,和普通android工程頂層build.gradle基本一致棺滞,配置倉儲(chǔ)庫位置裁蚁。

####不同之處
rootProject.buildDir = '../build'
subprojects {
    project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
    project.evaluationDependsOn(':app')
}

rootProject是android工程目錄,設(shè)置build目錄是當(dāng)前的父目錄继准,即Flutter工程目錄,因此矮男,android工程的build產(chǎn)物在Flutter工程build目錄下移必。

android工程build產(chǎn)物目錄

android子模塊,每一個(gè)subprojects毡鉴,子模塊build的輸出目錄崔泵,在Flutter工程的build目錄中,創(chuàng)建子模塊name的輸出目錄猪瞬,例如憎瘸,app主模塊。
如果新建mylibrary模塊陈瘦,將輸出mylibrary的build目錄幌甘。

subprojects子模塊build輸出路徑

3,模塊級(jí)構(gòu)建build.gradle文件痊项,app主模塊锅风。

def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
    localPropertiesFile.withReader('UTF-8') { reader ->
        localProperties.load(reader)
    }
}
def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
    throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '1'
}
def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
    flutterVersionName = '1.0'
}
apply plugin: 'com.android.application'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

讀取android目錄,local.properties文件鞍泉,該文件包括android sdk路徑皱埠,flutter sdk路徑,flutter版本咖驮,如果未配置flutter sdk路徑边器,拋出Flutter SDK not found異常。
普通工程local.properties文件只包含android sdk路徑托修。
apply plugin忘巧,app主模塊是一個(gè)application。
apply from诀黍,引入flutter.sdk路徑下的gradle文件flutter.gradle袋坑,flutterRoot是flutter sdk路徑。
先執(zhí)行flutter.gradle內(nèi)容眯勾,加入一些打包時(shí)的Flutter任務(wù)插件枣宫。

# local.properties文件
sdk.dir=/Users/xxx/Library/Android/sdk,//android sdk路徑
flutter.sdk=/Users/xxx/Documents/flutter吃环,//flutter sdk路徑
flutter.buildMode=debug
flutter.versionName=1.0.0
flutter.versionCode=1

三也颤、插件工程

AndroidStudio創(chuàng)建一個(gè)Flutter插件工程。

AndroidStudio創(chuàng)建Flutter插件工程目錄

插件工程提供了dart訪問原生系統(tǒng)的功能郁轻,包括dart接口和原生api翅娶,dart接口在lib目錄文留,定義一個(gè)_channel.invokeMethod(),訪問原生方法竭沫。
原生api在android目錄燥翅,定義一個(gè)實(shí)現(xiàn)MethodCallHandler接口類。
example目錄蜕提,是一個(gè)完整的Flutter工程森书,測試插件。
測試插件的Flutter工程exmple目錄android子工程谎势,頂層構(gòu)建settings.gradle文件凛膏,和普通Futter工程android目錄的構(gòu)建文件相同。

include ':app'
//android工程根目錄的父目錄脏榆,即flutter工程根目錄
def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()

//讀取flutter工程根目錄下.flutter-plugin文件
def plugins = new Properties()
def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
if (pluginsFile.exists()) {
    pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
}
//遍歷.flutter-plugin中每項(xiàng)插件猖毫,include引入每項(xiàng)插件模塊
plugins.each { name, path ->
    def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
    include ":$name"
    project(":$name").projectDir = pluginDirectory
}

flutterProjectRoot目錄,android目錄的父目錄须喂,即example目錄吁断,查找.flutter-plugins文件,保存插件name和路徑镊折,include對(duì)應(yīng)name模塊胯府,每一個(gè)模塊,代表一個(gè)android插件原生api恨胚。

.flutter-plugins文件

.flutter-plugins文件內(nèi)容骂因,key是插件name,value是路徑赃泡。

在插件工程寒波,example測試目錄下的android主模塊,引入example外層插件工程目錄android插件模塊升熊,(和example平級(jí))俄烁。
example目錄下lib的dart代碼,調(diào)用插件dart接口级野,(lib和example平級(jí))页屠,提供的方法,獲取原生功能蓖柔。


任重而道遠(yuǎn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辰企,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子况鸣,更是在濱河造成了極大的恐慌牢贸,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件镐捧,死亡現(xiàn)場離奇詭異潜索,居然都是意外死亡臭增,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門竹习,熙熙樓的掌柜王于貴愁眉苦臉地迎上來誊抛,“玉大人,你說我怎么就攤上這事整陌∩置” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵蔓榄,是天一觀的道長。 經(jīng)常有香客問我默刚,道長甥郑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任荤西,我火速辦了婚禮澜搅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘邪锌。我一直安慰自己勉躺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布觅丰。 她就那樣靜靜地躺著饵溅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪妇萄。 梳的紋絲不亂的頭發(fā)上蜕企,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音冠句,去河邊找鬼轻掩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛懦底,可吹牛的內(nèi)容都是我干的唇牧。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼聚唐,長吁一口氣:“原來是場噩夢啊……” “哼丐重!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拱层,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤弥臼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后根灯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體径缅,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掺栅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纳猪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氧卧。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖氏堤,靈堂內(nèi)的尸體忽然破棺而出沙绝,到底是詐尸還是另有隱情,我是刑警寧澤鼠锈,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布闪檬,位于F島的核電站,受9級(jí)特大地震影響购笆,放射性物質(zhì)發(fā)生泄漏粗悯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一同欠、第九天 我趴在偏房一處隱蔽的房頂上張望样傍。 院中可真熱鬧,春花似錦铺遂、人聲如沸衫哥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撤逢。三九已至,卻和暖如春捌斧,著一層夾襖步出監(jiān)牢的瞬間笛质,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工捞蚂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留妇押,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓姓迅,卻偏偏與公主長得像敲霍,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子丁存,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容