android项目集成 flutter

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

  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的设置如下

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)
      );
  }
});

你可能感兴趣的:(flutter)