You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin Android WebView执行JS报错:缺少resultCallback参数

解决Android WebView中EvaluateJavascript缺少resultCallback的问题

别着急,咱们一步步拆解这个问题,你遇到的报错核心是EvaluateJavascript必须传入回调实例,哪怕你不需要处理返回结果也不能省略,下面是具体的修复方案:

1. 先确保IValueCallback的正确实现(针对Xamarin.Android场景)

你的报错提示缺少resultCallback实参,说明调用时没传入符合要求的回调对象。先把回调类写对,注意必须继承Java.Lang.Object才能和Android的Java层兼容:

public class JsResultCallback : Java.Lang.Object, IValueCallback
{
    public void OnReceiveValue(Java.Lang.Object value)
    {
        // 这里可以处理JS返回的结果,不需要的话留空也可以
        if (value != null)
        {
            string jsResult = value.ToString();
            Console.WriteLine("JS执行返回:" + jsResult);
        }
    }
}

2. 正确调用EvaluateJavascript的姿势

在MotionEventAction.Down的事件处理里,必须把刚才写的回调实例传进去,不能省略这个参数:

// 假设你的WebView实例是webView
webView.EvaluateJavascript("你的JS函数名()", new JsResultCallback());

如果完全不需要处理JS的返回结果,也可以写个极简的匿名回调:

webView.EvaluateJavascript("你的JS函数名()", new ValueCallbackEmptyImpl());

private class ValueCallbackEmptyImpl : Java.Lang.Object, IValueCallback
{
    public void OnReceiveValue(Java.Lang.Object value)
    {
        // 空实现,什么都不用做
    }
}

3. 额外要注意的细节

  • 必须在主线程调用:EvaluateJavascript只能在UI主线程执行,如果你的触摸事件处理是在非主线程,记得切换:
webView.Post(() => {
    webView.EvaluateJavascript("你的JS函数名()", new JsResultCallback());
});
  • 检查WebView的JS开关:先确认WebView已经开启了JavaScript支持,不然JS函数本身就跑不起来:
webView.Settings.JavaScriptEnabled = true;

完整示例代码片段

把这些整合起来,你的触摸事件处理代码应该是这样的:

// 初始化WebView时开启JS支持
webView.Settings.JavaScriptEnabled = true;

// 处理触摸事件
public override bool OnTouchEvent(MotionEvent e)
{
    if (e.Action == MotionEventActions.Down)
    {
        // 确保在主线程调用EvaluateJavascript
        webView.Post(() => {
            webView.EvaluateJavascript("executeMyJsFunction()", new JsResultCallback());
        });
        return true;
    }
    return base.OnTouchEvent(e);
}

// 回调实现类
public class JsResultCallback : Java.Lang.Object, IValueCallback
{
    public void OnReceiveValue(Java.Lang.Object value)
    {
        if (value != null)
        {
            string result = value.ToString();
            // 根据业务需求处理返回结果
            Console.WriteLine("JS执行结果:" + result);
        }
    }
}

核心就是EvaluateJavascript的第二个参数是必填项,哪怕是空实现的回调也不能省略,这样就能解决你遇到的参数缺失问题了。

内容的提问来源于stack exchange,提问作者Mark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:47:40