Flutter 混合开发 之 手动加载Flutter modul

创建module
根目录:D:\flutter-boot
Android 项目目录:D:\flutter-boot\flutter_android
1.创建flutter module:在D:\flutter-boot目录下 右键打开终端,输入 flutter create -t module --org com.example flutter_module
- 使用命令或者Android studio编译module,生成.android 和.ios
使用命令编译:
cd flutter_module
flutter build aar
使用Android studio 打开flutter_module项目,选择build->flutter->build aar

3.配置结果如下

4.Android studio 打开flutter_mudule

配置Android 项目
1.设置setting.gradle
setBinding(new Binding([gradle:this]))
evaluate(new File(
settingsDir.parentFile,'flutter_module/.android/include_flutter.groovy'
))
2.设置 build.gradle(app)
android {
buildTypes {
profile {
initWith debug
}
}
compileOptions {
sourceCompatibility 1.8
targetCompatibility 1.8
}
}
repositories {
maven {
url 'some/path/my_flutter/build/host/outputs/repo'
// This is relative to the location of the build.gradle file
// if using a relative path.
}
maven {
url 'https://storage.googleapis.com/download.flutter.io'
}
}
dependencies {
implementation project(':flutter')
}
3.配置完之后,同步项目 build,项目结构如下

在Android项目中嵌入flutter界面
官方文档
注意:在Flutter新版本1.12中删除了io.flutter.facade.Flutter,所以不能使用FlutterView和FlutterFragment来加载Flutter界面,新版本中通过FlutterActivity来加载Flutter界面,注意路径包名是:io.flutter.embedding.android.FlutterActivity
1.首先在AndroidManifest文件中添加FlutterActivity
<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"
/>

2.在需要跳转的地方,跳转 FlutterActivity
2.1 不指定跳转路径,默认跳转flutter main页面
myButton.setOnClickListener {
startActivity(
FlutterActivity.createDefaultIntent(this)
)
}
2.2指定跳转路径,在flutter页面需要根据名称,加载需要显示的界面 /my_route 就是指定的名称
myButton.setOnClickListener {
startActivity(
FlutterActivity
.withNewEngine()
.initialRoute("/my_route")
.build(this)
)
}
使用缓存,加载Flutter 界面
官方文档
默认情况下,每个FlutterActivity都创建自己的FlutterEngine。浪费时间,浪费内存
1.在application中进行初始化
class MyApplication : Application() {
private lateinit var flutterEngine: FlutterEngine
companion object {
const val FLUTTER_ACTIVITY_ENGINE_ID = "my_engine_id"
}
override fun onCreate() {
super.onCreate()
// Instantiate a FlutterEngine.
flutterEngine = FlutterEngine(this)
// Start executing Dart code to pre-warm the FlutterEngine.
flutterEngine.dartExecutor.executeDartEntrypoint(
DartExecutor.DartEntrypoint.createDefault()
)
// Cache the FlutterEngine to be used by FlutterActivity.
FlutterEngineCache
.getInstance()
.put(FLUTTER_ACTIVITY_ENGINE_ID, flutterEngine)
}
}
2.利用缓存的FlutterEngine 加载FlutterActivity
使用缓存的时候 要保证cachedEngineId 一致
toFlutterBtn.setOnClickListener {
/* startActivity(
FlutterActivity.createDefaultIntent(this)
)*/
//使用缓存的情况
startActivity(
FlutterActivity
.withCachedEngine(MyApplication.FLUTTER_ACTIVITY_ENGINE_ID)
.build(this)
)
}