android项目集成 flutter

官方连接参考
目前大部分项目都是已经有原生的了,而后集成flutter做为子模块开发,趟了一些坑,记录一下java

  1. flutter目前只支持 arm v7 和v8 架构
android {
  //...
  defaultConfig {
    ndk {
      // Filter for architectures supported by Flutter.
      abiFilters 'armeabi-v7a', 'arm64-v8a'
    }
  }
}
  1. 须要java 1.8的支持
compileOptions {
    sourceCompatibility 1.8
    targetCompatibility 1.8
  }
  1. 官方提供了将flutter 模块打包成aar 或者直接项目源码依赖的两种方式,不是很大的项目均可以源码依赖,建立flutter module 的时候注意 是否须要支持 androidx ,默认是支持 ,但我估计不少小伙伴的项目因为各类历史应该并无迁移到anroidx。那建立模块的时候 注意加下面这个参数 --no-androidx
    不然AS 各类奇怪的报错等着你
flutter create -t module --no-androidx myflutter

建立modle 的时候注意是在原项目内,仍是和原项目同一级目录, 若是是同原项目平级, settings.gradle的设置以下android

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 ,别弄混了web

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初始化渲染引擎须要时间,那怎么办呢,bash

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 去查找缓存的渲染引擎app

myButton.addOnClickListener(new OnClickListener() {
  @Override
  public void onClick(View v) {
    startActivity(
      FlutterActivity
        .withCachedEngine("my_engine_id")
        .build(context)
      );
  }
});