如何向Android应用添加支持Flutter Channel的Flutter页面及解决AAR原生调用问题
解决Flutter AAR集成中Channel通信及原生代码缺失问题
一、实现Flutter与原生的Channel通信
不管是直接集成还是打包AAR,先把Channel通信的基础逻辑搭好:
- 在Flutter模块里配置MethodChannel
直接在Dart文件里创建Channel实例,定义调用原生方法的逻辑:
import 'package:flutter/services.dart'; class NativeDataFetcher { // 注意Channel名称要和原生端完全一致 static const _channel = MethodChannel('com.example/native_data_channel'); static Future<String> getNativeData() async { try { // 调用原生端的getNativeData方法 final String result = await _channel.invokeMethod('getNativeData'); return result; } on PlatformException catch (e) { return "获取失败: ${e.message}"; } } }- 在Flutter模块里配置MethodChannel
- 在Flutter模块的Android原生目录里实现Channel方法
重要:原生代码必须写在Flutter模块的android/src/main/kotlin/(或Java)目录下,不是主Android项目里。比如写个自定义FlutterActivity来注册Channel:
import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugin.common.MethodChannel class FlutterDataActivity : FlutterActivity() { private val CHANNEL = "com.example/native_data_channel" override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) // 注册Channel方法处理器 MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result -> when (call.method) { "getNativeData" -> { // 返回原生数据,这里可以替换成实际的业务逻辑 val data = "从Android原生拿到的内容" result.success(data) } else -> result.notImplemented() } } } }- 在Flutter模块的Android原生目录里实现Channel方法
二、打包包含原生代码的Flutter AAR
默认打包AAR可能漏了原生代码,按下面步骤调整:
- 确认Flutter模块的Android代码结构
所有原生代码、资源都要放在Flutter模块的android/src/main/目录下,比如上面的FlutterDataActivity要放在flutter_module/android/src/main/kotlin/com/example/flutter_module/里。
- 确认Flutter模块的Android代码结构
- 修改Flutter模块的build.gradle
打开Flutter模块的android/build.gradle,确保配置正确:
plugins { id "com.android.library" id "kotlin-android" id "dev.flutter.flutter-gradle-plugin" } android { namespace "com.example.flutter_module" compileSdkVersion 34 defaultConfig { minSdkVersion 21 targetSdkVersion 34 } // 确保源码目录被正确识别 sourceSets { main { kotlin.srcDirs += 'src/main/kotlin' java.srcDirs += 'src/main/java' } } } dependencies { // 如果有原生依赖(比如OkHttp),直接加在这里,会一起打包进AAR implementation 'com.squareup.okhttp3:okhttp:4.12.0' }- 修改Flutter模块的build.gradle
- 执行打包命令
进入Flutter模块根目录,运行:
flutter build aar打包完成后,AAR会生成在
build/host/outputs/repo/目录,这个包已经包含了所有原生代码和Channel配置。- 执行打包命令
三、主Android项目集成AAR并验证
- 配置主项目的settings.gradle
添加Flutter AAR的仓库地址:
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() // 替换成你的Flutter模块路径 maven { url '../flutter_module/build/host/outputs/repo' } maven { url "https://storage.googleapis.com/download.flutter.io" } } }- 配置主项目的settings.gradle
- 添加AAR依赖
在主项目的app/build.gradle里加依赖:
dependencies { // 替换成你的Flutter模块的groupId和版本号 implementation 'com.example.flutter_module:flutter_release:1.0' }- 添加AAR依赖
- 启动Flutter页面测试Channel
在主项目的Activity里启动自定义的FlutterActivity:
import android.content.Intent import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.View class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) findViewById<View>(R.id.btn_open_flutter).setOnClickListener { startActivity(Intent(this, FlutterDataActivity::class.java)) } } }启动后,Flutter端调用
NativeDataFetcher.getNativeData()就能拿到原生数据,验证通信是否正常。- 启动Flutter页面测试Channel
四、常见问题排查
- 若AAR没包含原生代码:检查Flutter模块的
android/src/main/目录结构,确认代码没放错位置;检查build.gradle的sourceSets配置是否正确。 - 若Channel调用失败:核对两端的Channel名称、方法名是否完全一致;检查原生端是否正确注册了MethodCallHandler。
内容的提问来源于stack exchange,提问作者Ramji
相关产品推荐
相关产品推荐

