在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
相关产品推荐
相关产品推荐

