Android原⽣项⽬集成Flutter解决⽅案
了解⼀下如何在 Android 原⽣项⽬中集成 Flutter
⽣成配置
在原⽣项⽬根⽬录执⾏命令
flutter create -t module --org {package_name} {module_name}
// 此处 module_name 的命令遵循 Android ⼦ module 的命名即可。不能有中划线。
// ⽐如,
flutter create -t module --ineer.mini.flutter flutter_sub
// 此处 module_name 的命令遵循 Android ⼦ module 的命名即可。不能有中划线。
// ⽐如,
flutter create -t module --ineer.mini.flutter flutter_sub
</pre>
结果
Creating project
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/l (created)
sub_flutter/.l (created)
sub_flutter/.l (created)
Running "flutter pub get" in 1,054ms
Wrote 11 files.
最终⽣成了以上⽂件,注意这⾥最后⾃动执⾏了 flutter pub get 的命令。关于 flutter pub get 具体做了什么,可以参考后⾯的。
这⾥在项⽬根⽬录创建⼦ module 只是为了把代码放在⼀个仓库,⽅便维护,理论上可以放在硬盘的任何位置。
配置原⽣项⽬ adle
在配置 adle 之前先来简单回顾⼀下关于 Gradle 的⼀些基础知识。
如果你了解过 Gradle 相关的配置的话,⼀定会看到⼀个概念,就是约定优于配置,什么意思呢,按照
⾯向对象的思路来理解,每⼀个⼯程是⼀个巨⼤的 Project 类,整个类⾥有很多的属性。⽽我们创建的每⼀个项⽬其实就是⼀个具体的 Project 对象(也就是实例).约定优于配置的意思,就是在 project 实例化的时候,其内部的属性已经有了默认值。那么我们怎么知道有哪些默认值呢?在项⽬根⽬录执⾏
./gradlew properties
就可以得到整个 Project 的⼀些默认配置,⽐如(此处节选部分结果)
------------------------------------------------------------
Root project
------------------------------------------------------------
allprojects: [root project 'MiniApp', project ':app', project ':thirdlib']
android.agp.version.check.performed: true
android.useAndroidX: true
buildDir: /Users/username/Documents/mygithub/MinApp/build
buildFile: /Users/username/Documents/mygithub/adle
projectDir: /Users/username/Documents/mygithub/MinApp
rootDir: /Users/username/Documents/mygithub/MinApp
rootProject: root project 'MiniApp'
这⾥当前有⼀些是我们配置的,⽐如 useAndroidX,但也有⼀些是约定的,⽐如对于整个 project 来说 buildDir 就是项⽬根⽬录的 build ⽂件夹等。
执⾏
./gradlew :app:properties
节选部分结果
buildDir: /Users/username/Documents/mygithub/MinApp/app/build
buildFile: /Users/username/Documents/mygithub/MinApp/adle
就会得到关于 app 整个 module 现阶段的⼀些配置信息,当然这些配置信息除了约定的,还有你⾃⼰配置的,⽐如buildToolsVersion ,签名等相关信息。可以看到 buildDir 和整个 project 的是不⼀样的。
回到主题,看看如何把我们刚才创建的 sub_flutter 模块集成到项⽬中。(严格来说并不是集成 sub_flutter 模块,因为他只是⼀个 flutter 的模块,⽽在 Android 主项⽬只能集成⼦ Android module,那么具体改怎么做呢,下⾯就来看看其中的奥秘)
按照官⽅的操作⽅法,会要求我们添加以下配置到 adle 中。
// Include the host app project.
include ':app'                                    // assumed existing content
setBinding(new Binding([gradle: this]))                                // new
evaluate(new File(                                                    // new
settingsDir.parentFile,                                              // new
'my_flutter/.android/vy'                        // new
))                                                                    // new
⾸先看看这⾥的 settingsDir 的值。在 adle 中直接添加
flutter开发appprintln "settings.dir=" + settingsDir
println "settings.dir.parent=" + settingsDir.parent
sync 之后就会看到输出
settings.dir=/Users/username/Documents/mygithub/MinApp
settings.dir.parent=/Users/username/Documents/mygithub
所以,上⾯的配置信息,就是说结合 settings 所在⽬录的⽗⽬录和我们配置的⽬录结合,到⼀个名为 vy 的⽂件,然后去执⾏他。
前⾯说了,创建⼦ module 的时候,可以是在项⽬根⽬录,也可以是在其他位置,如果是在其他位置,这⾥的 my_flutter 可以替换为你创建⽬录的绝对路劲。
这⾥是在根⽬录直接创建的,那么以上的配置就可以简化为
setBinding(new Binding([gradle: this]))
evaluate(new File(settingsDir, 'sub_flutter/.android/vy'))
include ':sub_flutter'
#### 关于 vy
上⾯说了,adle 的配置,其实就是去执⾏ vy 这个⽂件,可以简单看⼀下这个⽂件
def scriptFile = getClass().URI()
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()
ists(), ":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 = Property("flutter.sdk")
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
gradle.apply from: "$flutterSdkPath/packages/flutter_tools/gradle/module_adle"
.android 其实就是⼀个 Android 项⽬,他包含⼀个 Flutter ⽂件夹,这 Flutter 是⼀个 library 类型的 Android module ,这个⼀点从他的 adle ⽂件就可以看出。 vy 所做的事情,
就是将当前 library 命名为 flutter 的⼀个moudle。然后检查项⽬中 local.properties 中 sdk 的相关配置,最后去执⾏ FlutterSDK 的中 gradle 脚本,这⾥具体的分析就不再展开了。
也就是说,现在有⼀个名为 flutter 的 Android Library Module 。这个 module 包含 flutter 的所有配置。我们如果依赖了这个module ,那么就相当于是依赖了 Flutter .
依赖 flutter
最后在原⽣项⽬的 application-module 的 adle 的 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的资料请关注其它相关⽂章!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。