我创建了一个通用函数(在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)
}
}
答案 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中没有这种类型的转换我希望这会有所帮助