EvaluateJavaScript只允许返回类型的String?

时间:2017-08-02 00:29:42

标签: javascript java android android-webview kotlin

我创建了一个通用函数(在Kotlin中),我可以根据给定的命令调用JavaScript函数。

    fun evaluateJsFromNative(command: String, 
        webView: WebView, function: (value : String) -> Unit ) {
        webView.evaluateJavascript("(function() { return $command; })();") {
            s -> function(s)
        }
    }

但是,它只允许值String作为返回类型。如果我想要它更通用的东西,我可以返回布尔,Int,甚至什么都没有,我怎么能让它更通用?

E.g。我无法做到这一点...... function(s)中的s需要String

才会出错
    fun evaluateJsFromNative(command: String, 
        webView: WebView, function: (value : Boolean) -> Unit ) {
        webView.evaluateJavascript("(function() { return $command; })();") {
            s -> function(s)
        }
    }

1 个答案:

答案 0 :(得分:0)

您得到的错误是因为您已定义函数以获取布尔参数,但您在s -> function(s)传递String参数。它是一个String,因为这是定义WebView.evalueateJavascript()的方式。

您无法更改webView.evaluateJavascript()接受的功能类型。但是,您可以将String参数转换为Boolean并使用该参数调用您的函数。

例如(使用第二个实现采用布尔值):

fun evaluateJsFromNative(command: String, 
    webView: WebView, function: (value : Boolean) -> Unit ) {
    webView.evaluateJavascript("(function() { return $command; })();") {
        s -> function(s.toBoolean())
    }
}

// you would call it like this...
    evaluateJsFromNative(mycommand, mywebview) {
        Log.d("SomeTag","Value=$it")
    }

这是高度简化的,因为您可以将任何字符串作为命令提供,包括非Javascript。文档说只有当Javascript评估为evaluateJavascript()以外的其他内容时才会调用null的函数参数(注意,它将使用值{{1调用您的函数]如果您的WebView没有启用Javascript)。因此,即使并且假设您传递了良好的Javascript,但返回非空,'null'仍可能无法成功转换为s。换句话说,您需要做很多工作来处理错误的输入参数和处理您不期望的类型。

但是你问了一些更通用的东西。所以这是一个尝试;您必须扩展所支​​持的所有类型的Boolean语句(当然还有错误处理)。

when

此示例要求您指定JDL所期望的类型,然后必须将其从字符串解析为您期望的类型。而且您必须预先定义您将支持的类型。如果转换更简单会很好,但唉,根据this post in the Kotlin forums

,在Kotlin中没有这种类型的转换

我希望这会有所帮助