从 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 json字符串

'ip': '192.168.43.8','port':'812','timeout':500,"porta":[10,80]
    科特林
端口通过ipchannel = EventChannel(flutterPluginBinding.binaryMessenger, "portbyIpchanne") portbyipchannel.setStreamHandler(对象:EventChannel.StreamHandler 覆盖 fun onListen(参数:Any?,事件:EventChannel.EventSink?) val hashMap = 作为 HashMap 的参数 val 端口 = hashMap[“端口”] val ip = hashMap["ip"] val timeout = hashMap["timeout"] val arrayList = hashMap["porta"] as ArrayList val from = arrayList.get(0) as Int val to = arrayList.get(1) as Int 覆盖乐趣 onCancel(参数:任何?) print("=========>$arguments") )
    飞镖

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 支持?

如何将参数从 Flutter 传递给 Kotlin?

Kotlin 协程协程并发安全问题 ( 使用 Atomic 并发安全类型 | 使用 Channel 通道 | 使用 Mutext 轻量级锁 | 使用 Semaphore 轻量级信号量 )