如何在 Android 项目中集成 Flutter?

官方文档地址:flutter.cn/docs/add-to...

将 Flutter module 作为依赖项

主要有两种方法将 Flutter 模块添加为 Gradle 中宿主应用程序的依赖项。

  1. AAR 集成 AAR 机制可以为每个 Flutter 模块创建 Android AAR 作为依赖媒介。当你的宿主应用程序开发者不想安装 Flutter SDK 时,这是一个很好方案。但是每次修改都需要重新编译。
  2. 模块源码集成 直接将 Flutter 模块的源码作为子项目的依赖机制是一种便捷的一键式构建方案,但此时需要另外安装 Flutter SDK,这是目前 Android Studio IDE 插件使用的机制。

模块源码集成

介绍模块源码集成,这种方式的特定是将 Flutter 模块的源码作为子项目来依赖,需要开发人员本地具备 flutter 的开发环境。

流程步骤:

  1. 新建一个 Android 工程或者打开一个已有的 Android 工程
  2. 以 module 的形成创建一个 flutter 工程的 module,注意目录结构和 Android 工程平级
  3. 修改 settings.gradle 的设置
  4. 修改 build.gradle 的设置

一:这里我们用新项目演示,新建一个 Android 工程,名称是 AndroidWithFlutter。

二:使用File > New > New Flutter Project创建,选择Module,注意目录结构和 Android 工程平级,尽量是平级,不是的话后续的引入路径需要改一下。

目录结构是这样的:

markdown 复制代码
- WorkProject
    -  AndroidWithFlutter
    -  flutter_module

创建 flutter 项目(module 形式)的时候如上图所示,名称是:flutter_module

类型是:module,上图 3 处想要修改的话需要先把类型改为 application 才能修改语言和平台,这点注意一下。

三:修改 settings.gradle 的设置

在 AndroidWithFlutter 项目的 settings.gradle中添加如下配置:

arduino 复制代码
setBinding(new Binding([gradle: this]))
evaluate(new File(
        settingsDir.parentFile,
        'flutter_module/.android/include_flutter.groovy'
))

在settings.gradle的dependencyResolutionManagemen修改repositoriesMode的配置,改完如下所示:

rust 复制代码
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.PREFER_PROJECT)
    repositories {
        maven { url 'https://maven.aliyun.com/repository/public'}
        maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
        maven { url 'https://maven.aliyun.com/repository/google' }
        maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
        maven { url "https://jitpack.io" }
        google()
        mavenCentral()
    }
}

这个配置有三种方式:

  1. FAIL_ON_PROJECT_REPOS

表示如果工程单独设置了仓库,或工程的插件设置了仓库,构建就直接报错抛出异常

  1. PREFER_PROJECT

表示如果工程单独设置了仓库,就优先使用工程配置的,忽略settings里面的

  1. PREFER_SETTINGS

表述任何通过工程单独设置或插件设置的仓库,都会被忽略

原来settings.gradle里配置的是FAIL_ON_PROJECT_REPOS,而flutter_module单独设置了repository,所以会构建报错,改成PREFER_PROJECT之后,会忽略settings里面的配置,而高版本 gradle 的 Android 项目Android仓库配置都在settings.gradle中,所以需要设置仓库配置到 build.gradle

四:修改项目 build.gradle和 app 的build.gradle

修改项目 build.gradle,添加如下内容

scss 复制代码
allprojects {
    repositories {
        google()
        mavenCentral()
        maven { url 'https://jitpack.io' }
    }
}

修改 app 的build.gradle,依赖 flutter_module

添加Flutter页面

在清单文件注册 FlutterActivity 页面

ini 复制代码
        <activity
            android:name="io.flutter.embedding.android.FlutterActivity"
            android:screenOrientation="portrait" />

然后加载该 Activity

scala 复制代码
public class MainActivity extends AppCompatActivity {

    @SuppressLint("MissingInflatedId")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ((Button)findViewById(R.id.btn)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(
                        FlutterActivity.createDefaultIntent(MainActivity.this)
                );
            }
        });
    }
}

以 aar 的形式集成

aar 的形式,开发人员本地不需要具备 flutter 的开发环境,但是每次修改都需要重新编译。

官方文档地址:flutter.cn/docs/add-to...

步骤:

  1. 新建一个 Android 工程或者打开一个已有的 Android 工程
  2. 以 module 的形成创建一个 flutter 工程的 module,注意目录结构和 Android 工程平级
  3. 运行 flutter build aar 根据提示配置项目

前两步骤和以模块集成是一样的,这里就不重复了。有一点不一样的是这里flutter module 的名称是:myfluttermodule

打开 flutter 工程,在命令行执行 flutter build aar ,提示:

sql 复制代码
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 '/Users/tuionf/work/AndroidStudioProjects/myfluttermodule/build/host/outputs/repo'
        }
        maven {
            url "$storageUrl/download.flutter.io"
        }
      }

  3. Make the host app depend on the Flutter module:

    dependencies {
      debugImplementation 'com.example.myfluttermodule.myfluttermodule:flutter_debug:1.0'
      profileImplementation 'com.example.myfluttermodule.myfluttermodule:flutter_profile:1.0'
      releaseImplementation 'com.example.myfluttermodule.myfluttermodule:flutter_release:1.0'
    }


  4. 
    android {
      buildTypes {
        profile {
          initWith debug
        }
      }
    }

我们按照提示操作,注意下面的操作是在宿主 APP 里面:

  1. 配置仓库地址,提示是build.gradle,但实际上高版本gradle 的仓库地址在 setting.gradle 里面,参考下图配置红框位置,注意用你自己执行 flutter build aar 后的提示:
  1. 添加依赖
  1. 添加 profile build type

完成上面的步骤之后,然后注册 flutteractivity,加个跳转就可以了,参考上面源码依赖里面的 添加Flutter页面 部分。

相关推荐
xvch39 分钟前
Kotlin 2.1.0 入门教程(七)
android·kotlin
望风的懒蜗牛1 小时前
编译Android平台使用的FFmpeg库
android
浩宇软件开发1 小时前
Android开发,待办事项提醒App的设计与实现(个人中心页)
android·android studio·android开发
ac-er88882 小时前
Yii框架中的多语言支持:如何实现国际化
android·开发语言·php
苏金标3 小时前
The maximum compatible Gradle JVM version is 17.
android
zhangphil3 小时前
Android BitmapShader简洁实现马赛克,Kotlin(一)
android·kotlin
iofomo7 小时前
Android平台从上到下,无需ROOT/解锁/刷机,应用级拦截框架的最后一环,SVC系统调用拦截。
android
我叫特踏实8 小时前
SensorManager开发参考
android·sensormanager
五味香10 小时前
Java学习,查找List最大最小值
android·java·开发语言·python·学习·golang·kotlin
graceyun15 小时前
C语言进阶习题【1】指针和数组(4)——指针笔试题3
android·java·c语言