如何在 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 小时前
WhisperKit: Android 端测试 Whisper -- Android手机(Qualcomm GPU)部署音频大模型
android·智能手机·whisper·qualcomm
coder_pig1 小时前
📝小记:Ubuntu 部署 Jenkins 打包 Flutter APK
flutter·ubuntu·jenkins
梦想平凡1 小时前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle
元争栈道2 小时前
webview和H5来实现的android短视频(短剧)音视频播放依赖控件
android·音视频
阿甘知识库3 小时前
宝塔面板跨服务器数据同步教程:双机备份零停机
android·运维·服务器·备份·同步·宝塔面板·建站
元争栈道3 小时前
webview+H5来实现的android短视频(短剧)音视频播放依赖控件资源
android·音视频
捡芝麻丢西瓜3 小时前
flutter自学笔记5- dart 编码规范
flutter·dart
MuYe3 小时前
Android Hook - 动态加载so库
android
恋猫de小郭4 小时前
什么?Flutter 可能会被 SwiftUI/ArkUI 化?全新的 Flutter Roadmap
flutter·ios·swiftui
居居飒4 小时前
Android学习(四)-Kotlin编程语言-for循环
android·学习·kotlin