Flutter MethodChannel传递复杂参数时出现类型转换错误怎么办?

a'ゞ闪闪 阅读 66

在用Flutter的MethodChannel调用Android原生方法时,想传递一个包含多个字段的对象参数,但总是报”无法将Map转换为String”的错误。我尝试把参数转成Map类型,但原生层接收时还是有问题:


static const platform = MethodChannel('samples.flutter.dev/battery');
Map<String, dynamic> params = {
  'name': 'test',
  'value': 123,
  'nested': {'id': 456}
};
try {
  final result = await platform.invokeMethod('nativeMethod', params);
} catch (e) {
  print(e); // 输出类型转换错误
}

原生Android方法定义是public void nativeMethod(String data),我本意是想把Map转成JSON字符串传递,但不知道应该在哪个环节做序列化处理?是不是需要手动转成JSON字符串再传?

我来解答 赞 14 收藏
二维码
手机扫码查看
1 条解答
夏侯自豪
确实会报错,因为你在Flutter端传的是Map类型,但原生Android接收的是String类型。这种情况最简单的解决办法就是在Flutter端先把Map转成JSON字符串再传过去。

直接贴代码吧:

import 'dart:convert';

static const platform = MethodChannel('samples.flutter.dev/battery');
Map<String, dynamic> params = {
'name': 'test',
'value': 123,
'nested': {'id': 456}
};
try {
// 转成JSON字符串
String jsonString = jsonEncode(params);
final result = await platform.invokeMethod('nativeMethod', jsonString);
} catch (e) {
print(e);
}


然后在Android端接收时,记得把String再解析回Map:

public void nativeMethod(String data) {
try {
JSONObject jsonObject = new JSONObject(data);
String name = jsonObject.getString("name");
int value = jsonObject.getInt("value");
JSONObject nested = jsonObject.getJSONObject("nested");
int id = nested.getInt("id");

// 做你的逻辑处理
} catch (JSONException e) {
e.printStackTrace();
}
}


这样改完复制过去试试,应该就没问题了。JSON序列化反序列化是最常用的解决方案,别忘了导json包。
点赞 8
2026-01-29 11:05