Kotlin 使用 Java 回调接口

Kotlin use Java callback interface

我有一个 WebView。我想打电话给

public void evaluateJavascript(String script, ValueCallback<String> resultCallback)

这个方法。

这是 ValueCallback 接口:

public interface ValueCallback<T> {
    /**
     * Invoked when the value is available.
     * @param value The value.
     */
    public void onReceiveValue(T value);
};

这是我的科特林代码:

webView.evaluateJavascript("a", ValueCallback<String> {
            // cant override function
        })

有人知道在 kotlin 中重写 onReceiveValue 方法吗? 我尝试了 "Convert Java to Kotlin" 但结果是下一个:

v.evaluateJavascript("e") {  }

谢谢!

下一行称为 SAM conversion:

v.evaluateJavascript("e", { value ->
  // Execute onReceiveValue's code
})

每当 Java 接口只有一个方法时,Kotlin 允许您传入 lambda 而不是实现该接口的对象。

由于 lambda 是 evaluateJavascript 函数的最后一个参数,您可以将它移到括号外,这就是 Java 到 Kotlin 转换所做的:

v.evaluateJavascript("e") { value ->
  // Execute onReceiveValue's code
}

你已经是了。大括号之间的内容是 onReceive 函数的内容。 Kotlin 自动处理来自 Java 的 SAM 转换。以下都是等价的。

// Use Kotlin's SAM conversion
webView.evaluateJavascript("a") {
    println(it)  // "it" is the implicit argument passed in to this function
}

// Use Kotlin's SAM conversion with explicit variable name
webView.evaluateJavascript("a") { value ->
    println(value)
}

// Specify SAM conversion explicitly
webView.evalueateJavascript("a", ValueCallback<String>() {
    println(it)
})

// Use an anonymous class
webView.evalueateJavascript("a", object : ValueCallback<String>() {
    override fun onReceiveValue(value: String) {
        println(value)
    }
})