You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flutter中创建Pair并通过MethodChannel传递给Kotlin Activity

Flutter与Android通过MethodChannel传递键值对(Pair)实现方案

Dart端实现

你无需单独定义Pair类,直接用Dart的Map或列表封装键值对即可——MethodChannel会自动将Dart的基本类型、Map、List转换成Android端可识别的对应类型。

1. 初始化MethodChannel

注意:你之前用的EventChannel是用来监听原生推送事件的,双向方法调用要使用MethodChannel:

static const MethodChannel _channel = MethodChannel('your_unique_channel_name');

2. 调整sendMessage函数

如果你的Pair是唯一键的键值对,直接用Map<String, dynamic>传递(HashMap是Map的子类,用Map更通用):

static Future<void> sendMessage({
  Map<String, dynamic>? customData,
}) async {
  await _channel.invokeMethod('message', {
    'customData': customData,
  });
}

3. 调用函数封装Pair

把你的Pair直接转成Map传入:

// 封装多个Pair为Map
final customData = {
  'text': 'some text here',
  'my_value': '233',
};
await YourClass.sendMessage(customData: customData);

如果需要支持重复键的Pair集合(比如多个同key的键值对),改用List<Map<String, dynamic>>:

// 封装为Pair列表
final customData = [
  {'key': 'text', 'value': 'some text here'},
  {'key': 'my_value', 'value': '233'},
  {'key': 'text', 'value': 'another text'},
];
await YourClass.sendMessage(customData: customData);

Android端(Kotlin)接收处理

在你的Flutter Activity中初始化MethodChannel并处理参数:

class MainActivity : FlutterActivity() {
    private val CHANNEL_NAME = "your_unique_channel_name"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL_NAME).setMethodCallHandler { call, result ->
            when (call.method) {
                "message" -> {
                    // 接收唯一键的Map类型参数
                    val customData = call.argument<HashMap<String, Any>>("customData")
                    customData?.let {
                        for ((key, value) in it) {
                            // 根据业务逻辑处理键值对
                            when (key) {
                                "text" -> println("收到文本:${value as String}")
                                "my_value" -> println("收到数值:${value as Int}")
                            }
                        }
                    }

                    // 接收重复键的列表类型参数(如果用列表方案)
                    // val customDataList = call.argument<ArrayList<HashMap<String, Any>>>("customData")
                    // customDataList?.forEach { pair ->
                    //     val key = pair["key"] as String
                    //     val value = pair["value"]
                    //     println("Pair: $key -> $value")
                    // }

                    // 返回处理结果给Flutter
                    result.success(null)
                }
                else -> result.notImplemented()
            }
        }
    }
}

关键注意事项

  • 两端的Channel名称必须完全一致,否则无法通信
  • Dart与原生的类型映射要对应:Dart Map → Android HashMap,Dart List → Android ArrayList,基本类型(String/int/bool等)直接对应
  • 避免传递无法序列化的自定义对象,如需传递复杂数据,建议拆成基本类型或使用JSON序列化

内容的提问来源于stack exchange,提问作者Wafi_ck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 06:05:28