一、工程目錄
AndroidStudio創(chuàng)建一個(gè)Flutter項(xiàng)目氧骤,F(xiàn)lutter工程的目錄結(jié)構(gòu)和普通Android工程是不同的民珍,它是Google的跨平臺(tái)UI框架,包含android和ios目錄览爵。
android目錄,android子工程镇饮,和普通android工程類似蜓竹,包含app目錄,gradle目錄和gradle配置储藐。
ios目錄俱济,ios子工程。
lib目錄钙勃,dart源文件蛛碌。
pubspec.yaml文件,F(xiàn)lutter配置文件辖源,添加dart包packages依賴和包名蔚携。
二、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子模塊,每一個(gè)subprojects毡鉴,子模塊build的輸出目錄崔泵,在Flutter工程的build目錄中,創(chuàng)建子模塊name的輸出目錄猪瞬,例如憎瘸,app主模塊。
如果新建mylibrary模塊陈瘦,將輸出mylibrary的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插件工程。
插件工程提供了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文件內(nèi)容骂因,key是插件name,value是路徑赃泡。
在插件工程寒波,example測試目錄下的android主模塊,引入example外層插件工程目錄android插件模塊升熊,(和example平級(jí))俄烁。
example目錄下lib的dart代碼,調(diào)用插件dart接口级野,(lib和example平級(jí))页屠,提供的方法,獲取原生功能蓖柔。
任重而道遠(yuǎn)