如何在 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页面 部分。

相关推荐
断墨先生10 分钟前
uniapp—android原生插件开发(3Android真机调试)
android·uni-app
无极程序员2 小时前
PHP常量
android·ide·android studio
萌面小侠Plus3 小时前
Android笔记(三十三):封装设备性能级别判断工具——低端机还是高端机
android·性能优化·kotlin·工具类·低端机
慢慢成长的码农3 小时前
Android Profiler 内存分析
android
大风起兮云飞扬丶3 小时前
Android——多线程、线程通信、handler机制
android
君蓦3 小时前
Flutter 本地存储与数据库的使用和优化
flutter
L72563 小时前
Android的Handler
android
清风徐来辽3 小时前
Android HandlerThread 基础
android
HerayChen4 小时前
HbuildderX运行到手机或模拟器的Android App基座识别不到设备 mac
android·macos·智能手机