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

在Capacitor中调用Kotlin挂起函数崩溃,报参数不匹配错误怎么办?

Capacitor插件调用Kotlin挂起函数崩溃:参数数量不匹配问题解决

问题场景

你在Kotlin编写的Capacitor插件中调用挂起函数时应用崩溃,报错:

java.lang.RuntimeException: java.lang.IllegalArgumentException: Wrong number of arguments; expected 2, got 1

JS调用代码:

const {value} = await realmPlugin.initialize({ appId: 'myAppId' });

普通函数调用正常,但挂起函数触发上述错误。

问题原因

Kotlin挂起函数编译后会自动添加一个Continuation参数用于处理异步流程,而Capacitor插件方法默认只接收PluginCall类型的参数。当JS调用时仅传递了一个options对象(对应PluginCall),与编译后的挂起函数所需的2个参数不匹配,导致崩溃。

解决方案

不要直接将挂起函数标记为@PluginMethod,改用非挂起函数作为插件暴露的方法,内部通过Capacitor提供的coroutineScope启动协程来执行挂起逻辑,最后通过call.resolve()或call.reject()返回结果。

示例代码

Kotlin插件端

@CapacitorPlugin(name = "RealmPlugin")
class RealmPlugin : Plugin() {

    @PluginMethod
    fun initialize(call: PluginCall) {
        val appId = call.getString("appId") ?: run {
            call.reject("App ID is required")
            return
        }

        // 利用插件内置的协程作用域执行挂起逻辑
        coroutineScope.launch {
            try {
                val initResult = performRealmInitialization(appId)
                call.resolve(JSObject().apply {
                    put("value", initResult)
                })
            } catch (e: Exception) {
                call.reject("初始化失败: ${e.message}")
            }
        }
    }

    // 你的原始挂起函数逻辑
    private suspend fun performRealmInitialization(appId: String): String {
        // 这里执行实际的挂起操作,比如Realm初始化
        return "Realm initialized with appId: $appId"
    }
}

JS端调用

保持原调用代码不变即可:

const {value} = await realmPlugin.initialize({ appId: 'myAppId' });
console.log(value); // 输出 "Realm initialized with appId: myAppId"

关键说明

  • Capacitor的Plugin类内置了coroutineScope,可以安全地在其中启动协程处理异步任务,无需手动管理协程生命周期。
  • 通过call.resolve()返回成功结果,call.reject()返回错误信息,符合Capacitor插件的异步回调规范,JS端可以正常用await接收结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:16:14