【问题标题】:Access argument data in Kotlin from Flutter's Method channel从 Flutter 的方法通道访问 Kotlin 中的参数数据
【发布时间】: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 包含我刚刚发送的数据, 出现了两个问题:

  1. 如何访问来自argdata 的数据?例如。

  2. 如何从这个argData 获得我的user_dob

以下代码是我目前的解决方案。

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

但是抛出以下错误:Kotlin: Type mismatch: inferred type is String? but String was expected

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

【问题讨论】:

    标签: android json kotlin flutter dart


    【解决方案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]}
      
      1. 科特林
      端口通过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") } })
      1. 飞镖

      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 中传递参数

      1. 飞镖

      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))
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-11
        • 2019-10-21
        • 2012-03-11
        • 2011-12-21
        • 1970-01-01
        • 1970-01-01
        • 2021-05-07
        相关资源
        最近更新 更多