Android中如何将函数作为参数传递给Flutter模块打包的AAR
核心逻辑靠的是Flutter MethodChannel双向通信:原生和Flutter没法直接传递函数对象,得通过MethodChannel的方法调用,把“传函数”转化为回调注册、触发的逻辑。下面分Flutter端改造和原生端实现两步说明:
一、Flutter端适配AAR调用
用MethodChannel包装原有的函数参数逻辑
假设你原来的Flutter包有个接收函数参数的方法,比如setupCallback(VoidCallback callback),现在改成通过MethodChannel和原生交互的模式:import 'package:flutter/services.dart'; class MyFlutterPlugin { static const _channel = MethodChannel('my_flutter_plugin_channel'); static VoidCallback? _savedCallback; // 初始化时注册MethodChannel的消息监听 static void init() { _channel.setMethodCallHandler((call) async { switch (call.method) { case 'fireCallback': _savedCallback?.call(); // 触发保存的Flutter回调 return null; default: throw MissingPluginException(); } }); } // 保留原有的接收回调方法,也可通过MethodChannel触发注册 static void setupCallback(VoidCallback callback) { _savedCallback = callback; } // 可选:通知原生已准备好接收回调触发 static Future<void> notifyCallbackReady() async { await _channel.invokeMethod('callbackReady'); } }记得在Flutter模块的入口(比如
main.dart的initState)调用MyFlutterPlugin.init(),确保MethodChannel正常工作。打包AAR
执行Flutter打包命令生成AAR:flutter build aar
二、原生Android端实现
集成Flutter AAR
将生成的AAR导入Android项目,按Flutter官方流程配置依赖即可。初始化FlutterEngine并绑定MethodChannel
在你的Activity/Fragment中初始化FlutterEngine,同时获取对应的MethodChannel:import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugin.common.MethodChannel class MainActivity : FlutterActivity() { private lateinit var pluginChannel: MethodChannel override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) // 注意:channel名称必须和Flutter端完全一致 pluginChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "my_flutter_plugin_channel") // 监听Flutter发来的消息(比如回调准备就绪的通知) pluginChannel.setMethodCallHandler { call, result -> when (call.method) { "callbackReady" -> { // 可在此做初始化操作,比如记录触发回调的时机 result.success(null) } else -> result.notImplemented() } } } }模拟传递函数并触发
原生里的“函数参数”其实是通过MethodChannel触发Flutter端回调,或让Flutter主动调用原生方法,分两种场景:场景1:原生触发Flutter的回调
比如原生按钮点击后,调用Flutter端传入的函数:
// 原生按钮点击事件 fun onButtonClick(view: View) { // 通过MethodChannel通知Flutter触发回调 pluginChannel.invokeMethod("fireCallback", null) }场景2:Flutter调用原生的函数
如果需求是把原生函数传给Flutter,让Flutter主动调用,在原生的MethodChannel handler里暴露方法即可:
override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) pluginChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "my_flutter_plugin_channel") pluginChannel.setMethodCallHandler { call, result -> when (call.method) { "runNativeFunc" -> { // 执行原生函数逻辑 val output = doSomethingInNative() result.success(output) // 返回结果给Flutter } else -> result.notImplemented() } } } // 原生目标函数 private fun doSomethingInNative(): String { return "原生函数执行完成" }然后Flutter端通过MethodChannel调用这个原生函数,相当于把它当作参数使用:
static Future<String> callNativeFunction() async { final String result = await _channel.invokeMethod('runNativeFunc'); return result; }
注意事项
- MethodChannel的名称必须在Flutter和原生两端完全一致,否则会出现通信失败。
- 如果回调需要带参数或返回值,只需在
invokeMethod时传递对应参数(比如Map、基本类型),Flutter端处理后返回结果即可。 - 确保FlutterEngine初始化完成后再进行MethodChannel通信,避免空指针异常。
内容的提问来源于stack exchange,提问作者Umut Bayğut

