官方链接参考
目前大部分项目都是已经有原生的了,然后集成flutter作为子模块开发,趟了一些坑,记录一下
- flutter目前只支持 arm v7 和v8 架构
android {
//...
defaultConfig {
ndk {
// Filter for architectures supported by Flutter.
abiFilters 'armeabi-v7a', 'arm64-v8a'
}
}
}
- 需要java 1.8的支持
compileOptions {
sourceCompatibility 1.8
targetCompatibility 1.8
}
- 官方提供了将flutter 模块打包成aar 或者直接项目源码依赖的两种方式,不是很大的项目都可以源码依赖,创建flutter module 的时候注意 是否需要支持 androidx ,默认是支持 ,但我估计很多小伙伴的项目由于各种历史应该并没有迁移到anroidx。那创建模块的时候 注意加下面这个参数 --no-androidx
否则AS 各种奇怪的报错等着你
flutter create -t module --no-androidx myflutter
创建modle 的时候注意是在原项目内,还是和原项目同一级目录, 如果是同原项目平级, settings.gradle的设置如下
include ':app' // assumed existing content
setBinding(new Binding([gradle: this])) // new
evaluate(new File( // new
settingsDir.parentFile, // new
'myflutter/.android/include_flutter.groovy' // new
))
如果是在原项目内部 ,一个是parentFile 一个是path ,别弄混了
include ':app' // assumed existing content
setBinding(new Binding([gradle: this])) // new
evaluate(new File( // new
settingsDir.path, // new
'my_flutter/.android/include_flutter.groovy' // new
))
app 的gradle 中的配置 始终是如下 注意项目名称 并不是你想的刚才创建module指定的名称,为啥是这样,你可以参考.android/include_flutter.groovy文件就知道了
implementation project(':flutter')
flutter 提供了几种交互的方式,原生打开flutter提供的Activity的方法是 , 但这里你会观察到黑屏后才打开,这是因为flutter初始化渲染引擎需要时间,那怎么办呢,
myButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(
FlutterActivity.createDefaultIntent(context)
);
}
});
flutter 建议我们再application 中初始化并缓存起来,这样就不会有黑屏了。
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// Instantiate a FlutterEngine.
flutterEngine = new FlutterEngine(this);
// Start executing Dart code to pre-warm the FlutterEngine.
flutterEngine.getDartExecutor().executeDartEntrypoint(
DartEntrypoint.createDefault()
);
// Cache the FlutterEngine to be used by FlutterActivity.
FlutterEngineCache
.getInstance()
.put("my_engine_id", flutterEngine);
}
}
调动的时候通过id 去查找缓存的渲染引擎
myButton.addOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(
FlutterActivity
.withCachedEngine("my_engine_id")
.build(context)
);
}
});