从Flutter的方法频道访问Kotlin中的参数数据

时间:2019-11-24 09:07:25

标签: android json kotlin flutter dart

我已经在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包含我刚刚发送的数据, 然后出现两个问题:

  1. 如何从argdata访问数据?例如

  2. 如何从此user_dob获取我的argData

下面的代码是我当前的解决方案。

val userDOB : String = call.argument("user_dob")

但是会引发以下错误:Kotlin: Type mismatch: inferred type is String? but String was expected

  

注意:当我将地图数据发送到MethodChannel时,它被意外地作为字符串发送。要遵循 THIS 方法,请确保在传递数据时实现了Map对象。

2 个答案:

答案 0 :(得分:3)

从Flutter的方法通道获取方法参数时,传入的数据是json格式的字符串。

您只需调用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; DR

在Kotlin中,将可为空的对象用于可为空的数据。

val userDOB : String? = call.argument("user_dob")

并与?.一起使用(无效)

答案 1 :(得分:0)

映射 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
}