日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Android原生項目集成Flutter解決方案

瀏覽:27日期:2022-09-19 17:17:08

了解一下如何在 Android 原生項目中集成 Flutter

生成配置

在原生項目根目錄執行命令 flutter create -t module --org {package_name} {module_name} // 此處 module_name 的命令遵循 Android 子 module 的命名即可。不能有中劃線。 // 比如, flutter create -t module --org com.engineer.mini.flutter flutter_sub // 此處 module_name 的命令遵循 Android 子 module 的命名即可。不能有中劃線。 // 比如, flutter create -t module --org com.engineer.mini.flutter flutter_sub</pre>

結果

Creating project sub_flutter...sub_flutter/test/widget_test.dart (created)sub_flutter/sub_flutter.iml (created)sub_flutter/.gitignore (created)sub_flutter/.metadata (created)sub_flutter/pubspec.yaml (created)sub_flutter/README.md (created)sub_flutter/lib/main.dart (created)sub_flutter/sub_flutter_android.iml (created)sub_flutter/.idea/libraries/Dart_SDK.xml (created)sub_flutter/.idea/modules.xml (created)sub_flutter/.idea/workspace.xml (created)Running 'flutter pub get' in sub_flutter... 1,054msWrote 11 files.

最終生成了以上文件,注意這里最后 自動執行了 flutter pub get 的命令。關于 flutter pub get 具體做了什么,可以參考后面的。

這里在項目根目錄創建子 module 只是為了把代碼放在一個倉庫,方便維護,理論上可以放在硬盤的任何位置。

配置原生項目 settings.gradle

在配置 settings.gradle 之前先來簡單回顧一下關于 Gradle 的一些基礎知識。

如果你了解過 Gradle 相關的配置的話,一定會看到一個概念,就是 約定優于配置 ,什么意思呢,按照面向對象的思路來理解,每一個工程是一個巨大的 Project 類,整個類里有很多的屬性。而我們創建的每一個項目其實就是一個具體的 Project 對象(也就是實例).約定優于配置的意思,就是在 project 實例化的時候,其內部的屬性已經有了默認值。那么我們怎么知道有哪些默認值呢?在項目根目錄執行

./gradlew properties

就可以得到整個 Project 的一些默認配置,比如(此處節選部分結果)

------------------------------------------------------------Root project------------------------------------------------------------ allprojects: [root project ’MiniApp’, project ’:app’, project ’:thirdlib’]android.agp.version.check.performed: trueandroid.enableJetifier: trueandroid.enableR8: trueandroid.enableR8.libraries: trueandroid.useAndroidX: truebuildDir: /Users/username/Documents/mygithub/MinApp/buildbuildFile: /Users/username/Documents/mygithub/MinApp/build.gradleprojectDir: /Users/username/Documents/mygithub/MinApprootDir: /Users/username/Documents/mygithub/MinApprootProject: root project ’MiniApp’

這里當前有一些是我們配置的,比如 useAndroidX,但也有一些是約定的,比如 對于整個 project 來說 buildDir 就是項目根目錄的 build 文件夾等。

執行

./gradlew :app:properties

節選部分結果

buildDir: /Users/username/Documents/mygithub/MinApp/app/buildbuildFile: /Users/username/Documents/mygithub/MinApp/app/build.gradle

就會得到關于 app 整個 module 現階段的一些配置信息,當然這些配置信息除了約定的,還有你自己配置的,比如 buildToolsVersion ,簽名等相關信息。可以看到 buildDir 和整個 project 的是不一樣的。

回到主題, 看看如何把我們剛才創建的 sub_flutter 模塊集成到項目中。(嚴格來說并不是集成 sub_flutter 模塊,因為他只是一個 flutter 的模塊,而在 Android 主項目只能集成子 Android module,那么具體改怎么做呢,下面就來看看其中的奧秘)

按照官方的操作方法,會要求我們添加以下配置到 settings.gradle 中。

// Include the host app project.include ’:app’ // assumed existing contentsetBinding(new Binding([gradle: this]))// newevaluate(new File( // new settingsDir.parentFile, // new ’my_flutter/.android/include_flutter.groovy’ // new)) // new

首先看看 這里的 settingsDir 的值。在 settings.gradle 中直接添加

println 'settings.dir=' + settingsDirprintln 'settings.dir.parent=' + settingsDir.parent

sync 之后就會看到輸出

settings.dir=/Users/username/Documents/mygithub/MinAppsettings.dir.parent=/Users/username/Documents/mygithub

所以,上面的配置信息,就是說結合 settings 所在目錄的父目錄和我們配置的目錄結合,找到一個名為 include_flutter.groovy 的文件,然后去執行他。

前面說了,創建子 module 的時候,可以是在項目根目錄,也可以是在其他位置,如果是在其他位置,這里的 my_flutter 可以替換為你創建目錄的絕對路勁。

這里是在根目錄直接創建的,那么以上的配置就可以簡化為

setBinding(new Binding([gradle: this]))evaluate(new File(settingsDir, ’sub_flutter/.android/include_flutter.groovy’))include ’:sub_flutter’#### 關于 include_flutter.groovy

上面說了,settings.gradle 的配置,其實就是去執行 include_flutter.groovy 這個文件,可以簡單看一下這個文件

def scriptFile = getClass().protectionDomain.codeSource.location.toURI()def flutterProjectRoot = new File(scriptFile).parentFile.parentFile gradle.include ':flutter'gradle.project(':flutter').projectDir = new File(flutterProjectRoot, '.android/Flutter') def localPropertiesFile = new File(flutterProjectRoot, '.android/local.properties')def properties = new Properties() assert localPropertiesFile.exists(), ':exclamation:️The Flutter module doesn’t have a `$localPropertiesFile` file.' + 'nYou must run `flutter pub get` in `$flutterProjectRoot`.'localPropertiesFile.withReader('UTF-8') { reader -> properties.load(reader) } def flutterSdkPath = properties.getProperty('flutter.sdk')assert flutterSdkPath != null, 'flutter.sdk not set in local.properties'gradle.apply from: '$flutterSdkPath/packages/flutter_tools/gradle/module_plugin_loader.gradle'

.android 其實就是一個 Android 項目,他包含一個 Flutter 文件夾,這 Flutter 是一個 library 類型的 Android module ,這個一點從他的 build.gradle 文件就可以看出。 include_flutter.groovy 所做的事情,就是將當前 library 命名為 flutter 的一個 moudle。然后檢查項目中 local.properties 中 sdk 的相關配置,最后去執行 FlutterSDK 的中 gradle 腳本,這里具體的分析就不再展開了。

也就是說,現在有一個名為 flutter 的 Android Library Module 。這個 module 包含 flutter 的所有配置。我們如果依賴了這個 module ,那么就相當于是依賴了 Flutter .

依賴 flutter

最后在原生項目的 application-module 的 build.gradle 的 dependencies 閉包中添加

implementation project(’:flutter’)

至此,原生項目已經有了 Flutter 的依賴,可以使用 Flutter 的 View 了。

至此,現在的原生項目就包含 Flutter SDK 的所有依賴了,UI 相關的內容,改怎么寫還是用 dart 在 main.dart 中寫,然后我們就可以把這個 dart 渲染出來的內容按照 Activity 、Fragment 或 View 的形式添加到已有的項目中了。

flutter pub get

flutter pub get 或者 pub get 是在做 flutter 的時候在使用第三方 lib 或版本更新的時候經常會使用一個命令,通過這個命令會拉取相關的依賴,其實這個命令還會自動生成 Android 和 iOS 的原生項目。比如在我們創建就的 sub_flutter 模塊中,均自動生成了 .android 和 .ios 的原生項目目錄。同時這兩個目錄都是點打頭的,那么一般情況下就是隱藏文件,同時通過 .gitignore 文件也可以看到,對于 flutter module 形式來說,這兩個文件夾都是被忽略的,畢竟 flutter module 的核心,還是為了方便以 module 的形式集成到原生的項目中,內部的兩個原生目錄,一方面是為了方便集成,另一方面是便于直接運行執行 hot-reload 的調試。

以上就是Android原生項目集成Flutter解決方案的詳細內容,更多關于Android集成Flutter的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩一区网站| a日韩av网址| 日韩 欧美一区二区三区| 婷婷五月色综合香五月| 国产精品入口久久| 精品国产免费人成网站| 视频福利一区| 久久午夜影视| 欧美国产另类| 亚洲精品在线影院| 一本一道久久a久久| 麻豆91精品91久久久的内涵| 天堂资源在线亚洲| 亚洲一区二区日韩| 久久精品国产一区二区| 国产一区日韩一区| 日本aⅴ精品一区二区三区| 九九九精品视频| 不卡视频在线| 久久国产免费看| 四虎4545www国产精品| 亚洲乱亚洲高清| 国产一区二区三区探花| 亚洲欧美日韩国产一区| 国产精品久久久久久久久久久久久久久 | 美腿丝袜在线亚洲一区| 久久精品国产大片免费观看| 天堂va欧美ⅴa亚洲va一国产| 四季av一区二区凹凸精品| 亚洲一区二区免费看| 国产日韩欧美一区在线| 国内亚洲精品| 国产精品天天看天天狠| 亚洲精品网址| 久久av偷拍| 亚洲少妇诱惑| 成人在线丰满少妇av| 免费观看在线综合| 热三久草你在线| 青青伊人久久| 久久精品青草| 久久av网址| 综合一区在线| 久久精品国产68国产精品亚洲| 日韩1区2区日韩1区2区| 一区二区小说| 国产精品va| 亚洲精品少妇| 欧美羞羞视频| 国产高清亚洲| 综合欧美精品| 五月婷婷亚洲| 精品久久97| 欧美日韩伊人| 蜜桃视频在线观看一区二区| 婷婷综合六月| 久久精品九色| 97成人超碰| 免费一级片91| 精品在线99| 高清精品久久| 国产精品久久乐| 日韩免费精品| 另类国产ts人妖高潮视频| 欧美freesex黑人又粗又大| 国产色99精品9i| 三级欧美韩日大片在线看| 99精品视频在线| 国产一区二区三区不卡视频网站| 日韩精品亚洲aⅴ在线影院| 欧美网站在线| 成人在线网站| 高清不卡亚洲| 久久中文字幕导航| 69堂免费精品视频在线播放| 国产精品老牛| 欧美粗暴jizz性欧美20| 精品亚洲美女网站| 日韩亚洲一区在线| 久久久久久自在自线| 精品国产亚洲一区二区在线观看| 欧美在线精品一区| 日韩精品第二页| 亚洲日本国产| 日韩欧美三区| 天海翼精品一区二区三区| 日韩在线播放一区二区| 免费人成在线不卡| 亚洲资源网站| 日韩av中文字幕一区二区| 亚洲人成网站在线在线观看| 日韩专区欧美专区| 自拍自偷一区二区三区| 婷婷综合电影| 久久精品72免费观看| 国产精品一级在线观看| 免费在线日韩av| 久久精品国产福利| 国产资源在线观看入口av| 肉色欧美久久久久久久免费看| 日韩不卡免费高清视频| 国产 日韩 欧美一区| 久久伦理在线| 亚洲欧洲一区二区天堂久久| 三级在线观看一区二区| 蜜臀精品久久久久久蜜臀| 日韩视频免费| 免费人成网站在线观看欧美高清| 一区二区三区网站| 欧美日韩中文| 国产66精品| 国产一区久久| 一二三区精品| 国产一级成人av| 国产午夜精品一区在线观看| 免费日韩成人| 国产夫妻在线| 在线日韩av| 久久国产成人| 国产欧美一区二区色老头| 国产精品九九| 国产99在线| 午夜国产一区二区| 最新国产精品| 精品一区二区三区在线观看视频| 午夜av不卡| 欧美精品自拍| 日韩美女国产精品| 狠狠久久伊人| 欧美成人久久| 婷婷精品在线观看| 麻豆精品一区二区综合av| 日本午夜大片a在线观看| 亚洲国产影院| 日韩综合小视频| 精品视频一区二区三区在线观看| 日韩在线第七页| 夜久久久久久| 国产欧美久久一区二区三区| 亚洲一区资源| 首页亚洲欧美制服丝腿| 国产精品magnet| 欧美国产91| 欧美亚洲tv| 亚洲www啪成人一区二区| 中文字幕免费精品| 免费一级欧美片在线观看网站| 久久中文字幕av一区二区不卡| 亚洲毛片在线| 久久久久久夜| 日韩精品一区第一页| 国产精品多人| 性欧美xxxx免费岛国不卡电影| 亚洲精品乱码日韩| 97精品国产| 亚洲精品美女| 国产精品久久久久av电视剧| 少妇精品久久久| 日韩影院二区| 日韩精品欧美大片| 99久久99久久精品国产片果冰| 日韩欧美中文字幕在线视频| 日韩综合在线| 日韩一区网站| 国产91精品对白在线播放| 欧美日韩一区二区三区在线电影| www.九色在线| 日韩激情啪啪| 国产91精品对白在线播放| 国产毛片久久久| 免费国产自久久久久三四区久久 | 欧美日韩一区二区三区在线电影| 日韩免费av| 日本综合精品一区| 99久久夜色精品国产亚洲1000部| 久久国产精品色av免费看| 久久精品亚洲欧美日韩精品中文字幕| 欧美一级全黄| 日韩一级欧洲| 丁香婷婷久久| 日韩精品第二页| 欧美91视频| 中文在线а√天堂| 久久国产乱子精品免费女| 另类激情亚洲| 99久久久久国产精品| 久久久精品区| 视频一区日韩| 亚洲国产一区二区在线观看| 18国产精品| 99视频+国产日韩欧美| 精品精品久久| 日韩av电影一区| 亚洲综合三区| av资源亚洲| 国产精品v日韩精品v欧美精品网站 | 在线日韩视频| 国产成人精选| 国产调教一区二区三区| 亚洲综合日本|