从 Flutter 的方法通道访问 Kotlin 中的参数数据
Posted
技术标签:
【中文标题】从 Flutter 的方法通道访问 Kotlin 中的参数数据【英文标题】:Access argument data in Kotlin from Flutter's Method channel 【发布时间】:2020-03-19 19:40:09 【问题描述】:我已经在 Flutter 和 Kotlin 中设置了一个基本的 Method 通道。
以下是我的示例数据:
"user_dob":"15 November 1997",
"user_description":"Hello there, I am a User!",
"user_gender":"Male",
"user_session":"KKDSH3G9OJKJFIHXLJXUGWIOG9UJKLJ98WHIJ"
以下方法通道可以将数据从 Flutter 传递到 Kotlin 端:
var result = await platform.invokeMethod('updateProfile', data);
以下代码捕获 Kotlin 中的数据:
MethodChannel(flutterView, channel).setMethodCallHandler call, result ->
if(call.method == "updateProfile")
var argData = call.arguments
...
现在,argData
包含我刚刚发送的数据,
出现了两个问题:
如何访问来自argdata
的数据?例如。
如何从这个argData
获得我的user_dob
?
以下代码是我目前的解决方案。
val userDOB : String = call.argument("user_dob")
但是抛出以下错误:Kotlin: Type mismatch: inferred type is String? but String was expected
注意:当我将地图数据发送到 MethodChannel 时,它被意外地作为字符串发送。要遵循 THIS 方法,请确保在传递数据时实现了 Map 对象。
【问题讨论】:
【参考方案1】:从Flutter的方法通道获取方法参数时,传入的数据是json格式的String。
你可以简单地调用call.argument
,它会返回一个Nullable字符串。
在您的情况下,您请求 String
在 Kotlin 中是 Nun-null
字符串对象,但 call.argument
的返回值可能不存在于 json 中并且为空。所以你必须得到一个String?
而不是Nullable
字符串。
更新
检查并确保通道能够将数据传递给本机。
在颤抖中:
static const MethodChannel _channel = const MethodChannel('NAME');
在本机代码中:
val channel = MethodChannel(registrar.messenger(), "NAME");
TL;博士
在 Kotlin 中,对可以为 null 的数据使用 Nullable object。
val userDOB : String? = call.argument("user_dob")
并与?.
一起使用(空安全)
【讨论】:
我尝试使用第一个并编译。但是当我尝试使用方法调用时,我得到了类型转换错误。java.lang.ClassCastException
我已经更新了答案。确保通道完好无损,并且由于参数返回T
,您应该指定类型。
另外,你是什么意思,参数返回一个T。我如何指定一个类型?我是 Kotlin 的新手
您为val
指定的类型将转换为通用T
。所以val user: String? = call.argument()
会将T
转换为String?
好的,我遇到的问题是我没有发送地图数据对象。我发送的是一个字符串。因此,我创建了一个 Map() 对象,然后通过方法通道发送它。然后按照您的解决方案并使用 String? 进行投射,它起作用了。【参考方案2】:
映射 Json:
"user_dob":"15 November 1991",
Kotlin 代码:
MethodChannel(flutterView, channel).setMethodCallHandler call, result ->
//you can get data in this object.
val user_dob = call.argument<String>("user_dob")
if (user_dob == null)
// error
result.notImplemented()
return@setMethodCallHandler
//do else
【讨论】:
【参考方案3】:在 EventChannel 中传递参数
将参数转换为 HashMap
'ip': '192.168.43.8','port':'812','timeout':500,"porta":[10,80]
-
科特林
-
飞镖
static const EventChannel portbyIp_channel =
const EventChannel('portbyIpchannel');
Stream<String>? _onportbyIp;
Stream<String>? get onPortbyIp
var arguments =
'ip': '192.168.43.8',
'port': '812',
'timeout': 500,
"porta": [10, 80]
;
_onportbyIp = portbyIp_channel
.receiveBroadcastStream(arguments)
.map((event) => event.toString());
return _onportbyIp;
在 MethodChannel 中传递参数
-
飞镖
static const MethodChannel _channel = const MethodChannel('android_ip');
static Future<String?> get IpAddress_Wifi_tetherorwifi async
final String? version =
await _channel.invokeMethod('Wifi_tetherorWifi', 'ip': '192.168.43.8',
'port': '812',
'timeout': 500,
"porta": [10, 80],'key': 'true');
return version;
2.Kotlin
when (call.method)
"Wifi_tetherorWifi"->result.success(setMyMethod(call.arguments arguments as HashMap))
【讨论】:
以上是关于从 Flutter 的方法通道访问 Kotlin 中的参数数据的主要内容,如果未能解决你的问题,请参考以下文章
Flutter:在应用程序关闭或在后台运行原生 android 代码
MissingPluginException(在通道 flutter_email_sender 上找不到方法发送的实现)
如何从 Flutter App 中删除 Kotlin 支持?
Kotlin 协程协程并发安全问题 ( 使用 Atomic 并发安全类型 | 使用 Channel 通道 | 使用 Mutext 轻量级锁 | 使用 Semaphore 轻量级信号量 )