下面我将详细讲解 Flutter module 是如何被原生 Android 项目通过 Gradle 引入的,包括 include_flutter.groovy 的原理和作用。这有助于你深刻理解 Flutter 与原生集成的机制。

📦 一、flutter build aar:生成可复用的 Flutter 离线原生包(AAR)

🔧 用法:

cd flutter_module/
flutter build aar

📁 输出内容:

build/ 目录中生成结构如下的 AAR:

build/host/outputs/repo/
└── com/example/flutter_module/
    └── flutter_module/
        └── 1.0.0/
            ├── flutter_module-1.0.0.aar         ← 主 AAR 包
            ├── flutter_module-1.0.0.pom         ← Maven 配置

✅ 用法说明:

  • 你可以将 AAR 上传到私有 Maven 仓库(如 Nexus、Jitpack、阿里云仓库)
  • 或直接在原生项目中用 flatDir 引入本地依赖:
repositories {
    flatDir {
        dirs '../flutter_module/build/host/outputs/repo'
    }
}

dependencies {
    implementation(name: 'flutter_module-1.0.0', ext: 'aar')
}

🧠 优势:

  • 原生项目中无需包含整个 Flutter 工程,只需使用预编译的 AAR
  • 更适合团队多人协作、多个 App 共享 Flutter UI 组件场景
  • 提升 Gradle 构建效率,避免冗余依赖

🔌 二、Flutter 与原生的通信机制:MethodChannel、EventChannel

1️⃣ MethodChannel:Flutter 主动调用原生功能(或原生响应 Flutter 请求)

示例:

Flutter 端调用:

const platform = MethodChannel('com.example.channel');

Future<void> getBatteryLevel() async {
  final level = await platform.invokeMethod('getBatteryLevel');
  print("Battery level: $level");
}

Android 原生响应:

MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "com.example.channel")
    .setMethodCallHandler { call, result ->
        if (call.method == "getBatteryLevel") {
            val level = getBatteryLevel()
            result.success(level)
        } else {
            result.notImplemented()
        }
    }

2️⃣ EventChannel:用于发送原生持续性事件到 Flutter(如传感器、蓝牙等)

原生端推送事件:

val eventChannel = EventChannel(flutterEngine.dartExecutor.binaryMessenger, "com.example.event")
eventChannel.setStreamHandler(object : EventChannel.StreamHandler {
    override fun onListen(arguments: Any?, events: EventChannel.EventSink) {
        startBluetoothScan { data -> events.success(data) }
    }

    override fun onCancel(arguments: Any?) {
        stopScan()
    }
})

Flutter 接收:

const eventChannel = EventChannel('com.example.event');

eventChannel.receiveBroadcastStream().listen((data) {
  print("接收到原生事件:$data");
});

💡 通信场景举例:

通信方向 使用方式 典型应用
Flutter → 原生 MethodChannel 打开摄像头、支付、导航等
原生 → Flutter MethodChannel 返回原生结果给 Flutter
原生 → Flutter EventChannel 蓝牙监听、位置更新等

🧭 三、总结推荐使用路径

场景 推荐方式
项目中只用一个 Flutter 页面 使用 flutter_module + include_flutter.groovy
多个 App 共用 Flutter UI flutter build aar 生成 AAR 离线包
高频原生 ↔ Flutter 通信需求 配置 MethodChannel / EventChannel
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐