官方文档地址:flutter.cn/docs/add-to...
将 Flutter module 作为依赖项
主要有两种方法将 Flutter 模块添加为 Gradle 中宿主应用程序的依赖项。
- AAR 集成 AAR 机制可以为每个 Flutter 模块创建 Android AAR 作为依赖媒介。当你的宿主应用程序开发者不想安装 Flutter SDK 时,这是一个很好方案。但是每次修改都需要重新编译。
- 模块源码集成 直接将 Flutter 模块的源码作为子项目的依赖机制是一种便捷的一键式构建方案,但此时需要另外安装 Flutter SDK,这是目前 Android Studio IDE 插件使用的机制。
模块源码集成
介绍模块源码集成,这种方式的特定是将 Flutter 模块的源码作为子项目来依赖,需要开发人员本地具备 flutter 的开发环境。
流程步骤:
- 新建一个 Android 工程或者打开一个已有的 Android 工程
- 以 module 的形成创建一个 flutter 工程的 module,注意目录结构和 Android 工程平级
- 修改 settings.gradle 的设置
- 修改 build.gradle 的设置
一:这里我们用新项目演示,新建一个 Android 工程,名称是 AndroidWithFlutter。
二:使用File > New > New Flutter Project创建,选择Module,注意目录结构和 Android 工程平级,尽量是平级,不是的话后续的引入路径需要改一下。
目录结构是这样的:
markdown
- WorkProject
- AndroidWithFlutter
- flutter_module
创建 flutter 项目(module 形式)的时候如上图所示,名称是:flutter_module
类型是:module,上图 3 处想要修改的话需要先把类型改为 application 才能修改语言和平台,这点注意一下。
三:修改 settings.gradle 的设置
在 AndroidWithFlutter 项目的 settings.gradle中添加如下配置:
arduino
setBinding(new Binding([gradle: this]))
evaluate(new File(
settingsDir.parentFile,
'flutter_module/.android/include_flutter.groovy'
))
在settings.gradle的dependencyResolutionManagemen修改repositoriesMode的配置,改完如下所示:
rust
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.PREFER_PROJECT)
repositories {
maven { url 'https://maven.aliyun.com/repository/public'}
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven { url "https://jitpack.io" }
google()
mavenCentral()
}
}
这个配置有三种方式:
- FAIL_ON_PROJECT_REPOS
表示如果工程单独设置了仓库,或工程的插件设置了仓库,构建就直接报错抛出异常
- PREFER_PROJECT
表示如果工程单独设置了仓库,就优先使用工程配置的,忽略settings里面的
- PREFER_SETTINGS
表述任何通过工程单独设置或插件设置的仓库,都会被忽略
原来settings.gradle里配置的是FAIL_ON_PROJECT_REPOS,而flutter_module单独设置了repository,所以会构建报错,改成PREFER_PROJECT之后,会忽略settings里面的配置,而高版本 gradle 的 Android 项目Android仓库配置都在settings.gradle中,所以需要设置仓库配置到 build.gradle
四:修改项目 build.gradle和 app 的build.gradle
修改项目 build.gradle,添加如下内容
scss
allprojects {
repositories {
google()
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
修改 app 的build.gradle,依赖 flutter_module
添加Flutter页面
在清单文件注册 FlutterActivity 页面
ini
<activity
android:name="io.flutter.embedding.android.FlutterActivity"
android:screenOrientation="portrait" />
然后加载该 Activity
scala
public class MainActivity extends AppCompatActivity {
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
((Button)findViewById(R.id.btn)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(
FlutterActivity.createDefaultIntent(MainActivity.this)
);
}
});
}
}
以 aar 的形式集成
aar 的形式,开发人员本地不需要具备 flutter 的开发环境,但是每次修改都需要重新编译。
官方文档地址:flutter.cn/docs/add-to...
步骤:
- 新建一个 Android 工程或者打开一个已有的 Android 工程
- 以 module 的形成创建一个 flutter 工程的 module,注意目录结构和 Android 工程平级
- 运行 flutter build aar 根据提示配置项目
前两步骤和以模块集成是一样的,这里就不重复了。有一点不一样的是这里flutter module 的名称是:myfluttermodule
打开 flutter 工程,在命令行执行 flutter build aar ,提示:
sql
Consuming the Module
1. Open <host>/app/build.gradle
2. Ensure you have the repositories configured, otherwise add them:
String storageUrl = System.env.FLUTTER_STORAGE_BASE_URL ?: "https://storage.googleapis.com"
repositories {
maven {
url '/Users/tuionf/work/AndroidStudioProjects/myfluttermodule/build/host/outputs/repo'
}
maven {
url "$storageUrl/download.flutter.io"
}
}
3. Make the host app depend on the Flutter module:
dependencies {
debugImplementation 'com.example.myfluttermodule.myfluttermodule:flutter_debug:1.0'
profileImplementation 'com.example.myfluttermodule.myfluttermodule:flutter_profile:1.0'
releaseImplementation 'com.example.myfluttermodule.myfluttermodule:flutter_release:1.0'
}
4.
android {
buildTypes {
profile {
initWith debug
}
}
}
我们按照提示操作,注意下面的操作是在宿主 APP 里面:
- 配置仓库地址,提示是build.gradle,但实际上高版本gradle 的仓库地址在 setting.gradle 里面,参考下图配置红框位置,注意用你自己执行 flutter build aar 后的提示:
- 添加依赖
- 添加
profile
build type
完成上面的步骤之后,然后注册 flutteractivity,加个跳转就可以了,参考上面源码依赖里面的 添加Flutter页面 部分。