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

相关推荐
大白要努力!1 小时前
android 使用SQLiteOpenHelper 如何优化数据库的性能
android·数据库·oracle
Estar.Lee1 小时前
时间操作[取当前北京时间]免费API接口教程
android·网络·后端·网络协议·tcp/ip
Winston Wood1 小时前
Perfetto学习大全
android·性能优化·perfetto
旭日猎鹰2 小时前
Flutter踩坑记录(三)-- 更改入口执行文件
flutter
旭日猎鹰2 小时前
Flutter踩坑记录(一)debug运行生成的项目,不能手动点击运行
flutter
️ 邪神2 小时前
【Android、IOS、Flutter、鸿蒙、ReactNative 】自定义View
flutter·ios·鸿蒙·reactnative·anroid
Dnelic-4 小时前
【单元测试】【Android】JUnit 4 和 JUnit 5 的差异记录
android·junit·单元测试·android studio·自学笔记
Eastsea.Chen6 小时前
MTK Android12 user版本MtkLogger
android·framework
比格丽巴格丽抱13 小时前
flutter项目苹果编译运行打包上线
flutter·ios
长亭外的少年14 小时前
Kotlin 编译失败问题及解决方案:从守护进程到 Gradle 配置
android·开发语言·kotlin