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方法。

posted @ 2023-06-27 00:57  百密一疏  阅读(300)  评论(0编辑  收藏  举报