android 接入flutter module 混合开发
简介
大部分项目由于有历史原因无法完全使用flutter重写,所以部分使用flutter成为了常用的方案。一般接入方式有主项目接入module、aar依赖方式引入两种方法,aar依赖引入由于不需要主项目配置flutter环境,侵入性更小,所以下面主要介绍aar引入的方式。
接入flutter AAR 步骤
- 配置fluuter环境
这些根据官方文档和其他文章介绍很多,这里不再细谈,以下内容均在flutter doctor已经检测成功的环境下运行。 - 创建flutter module工程
注意这里的命令和创建flutter工程的命令有所不同,生成的产物也不同。有两种方式:- 使用Android studioc菜单项,即File->new->module选择fluttermodule,但在Androidstudio版本2022.2.1 Patch 2下由于和最新flutter插件不兼容,在newModule下并没有fluttermodule ,只有创建常规module。
- 使用flutter命令创建,在某一文件夹下使用命令:flutter create -t module --org com.example my_flutter
创建成功后导入项目首先执行命令:flutter pub get 会发现项目中多出了.android 文件夹,这里的.android文件夹是区别于flutter项目中的android 文件夹的,里面的内容均为自动生成,且每次编译过后会重新生成。这里的生成内容均和flutterSDK相关,如果改动其下的gradle文件下次运行时还会重新生成。flutter官方是不建议在这里做出改动的,有一条flutter命令:make-host-app-editable 可以将自动生成的跨平台native文件改为每次不自动生成,但是经测试,这条命令在flutter 3.0.0已经失效。
- 打包为aar
打包的flutter命令为: flutter build aar -v 后面增加-v显示详细信息,在出问题的时候便于排查,同时也可以使用Android studio中的Build -> flutter ->Build AAR 选项。 - 集成至已有项目
上文的flutter build aar 命令执行完毕后可在Android studio中的message看到集成的帮助信息如下
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 'C:\workspace\Android\androidproject\flutterModule\my_flutter\build\host\outputs\repo'
}
maven {
url "$storageUrl/download.flutter.io"
}
}
3. Make the host app depend on the Flutter module:
dependencies {
debugImplementation 'com.example.my_flutter:flutter_debug:1.0'
profileImplementation 'com.example.my_flutter:flutter_profile:1.0'
releaseImplementation 'com.example.my_flutter:flutter_release:1.0'
}
4. Add the `profile` build type:
android {
buildTypes {
profile {
initWith debug
}
}
}
To learn more, visit https://flutter.dev/go/build-aar
Process finished with exit code 0
根据帮助信息,我们要在宿主host中项目的gradle文件下的 repositories 下增加maven库,第一条url为你fluttermodule产物的路径,注意window下文件路径的转义字符。然后再宿主项目的app/gradle文件下增加依赖和profile。如果gradle sync成功即项目已经集成成功。
- 其他问题
在这里介绍下遇到的其他问题。- 1.由于宿主项目的限制flutter版本只能使用3.0.0,但是我们的Android studio版本是很新的这样就出现了问题:fluttermodule无法使用和主项目一致的gradle版本,在使用7.4的gradle版本后可以运行,但是flutterSDK的打包脚本报错,DevelopMaven 这个类无法识别,而使用自动生成的gradle版本Android studio会提示和内置的JDK 11不兼容。只能指定项目的gradle编译JDK为1.8,高版本Android studio已经支持内部下载多个JDK版本,切换项目编译的JDK版本即可。
- 2.宿主工程的profileImplementation无法识别。经测试新版本的Android studio搭配flutter没有出现此问题,应该是兼容问题,解决方案是在app/gradle文件下增加
configurations {
profileImplementation {}
}
- 向宿主页面增加flutter页面
1.直接增加flutteractivity
这种方式有两种方法,第一种直接在宿主的manifest增加:
<activity
android:name="io.flutter.embedding.android.FlutterActivity"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize"
/>
然后在点击事件中增加
myButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(
FlutterActivity.createDefaultIntent(currentActivity)
);
}
});
这种情况适用于flutter默认初始路由dart入口为main()具体的自定义路由在此不再详述。
2.继承FlutterActivity
另一种方式是宿主工程创建activity继承FlutterActivity,最简单的方式为:
public class FirstFlutterActivity extends FlutterActivity {
}
对,此方法不需要再手动加载布局文件,仅需要在manifest文件中增加相应的子activity即可,同时跳转方式可使用普通的Intent方法。
吾生也有涯,而知也無涯。以有涯隨無涯,殆已
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步