Flutter module 是如何被原生 Android 项目通过 Gradle 引入的
下面我将详细讲解 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 |