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

React Native Kotlin原生模块Double?可选参数崩溃问题求助

React Native Kotlin原生模块可选Double?参数崩溃问题解决

问题重现

React Native端调用原生模块方法时不传参数:

const {add} = NativeModules.MyModule;
add();  // 未传入任何参数

Kotlin中定义String?类型的可选参数可正常运行:

fun add(data: String?) {}

但定义Double?类型的可选参数时会直接崩溃:

fun add(data: Double?) {}

崩溃日志:

com.facebook.react.bridge.NativeArgumentsParseException: Attempt to invoke virtual method 'double java.lang.Double.doubleValue()' on a null object reference (constructing arguments for MyModule.add at argument index 0)

原因分析

React Native的Java/Kotlin桥接层对引用类型和装箱基本类型的可空处理逻辑不一致:

  • String?属于引用类型,桥接层遇到null时会直接传递null给参数,不会执行额外的拆箱操作,因此可以正常运行。
  • Double?是装箱后的基本类型,桥接层会尝试将参数转换为原始double类型,即使参数是null,也会调用Double.doubleValue()方法来拆箱,从而触发空指针异常。

解决方案

1. 使用函数重载

定义两个同名函数,分别处理有参数和无参数的场景:

fun add() {
    // 无参数时的逻辑
}

fun add(data: Double) {
    // 有参数时的逻辑
}

React Native调用add()时会匹配无参函数,调用add(123)时会匹配带Double参数的函数,避免空指针问题。

2. 给参数设置默认值

通过给Double?参数设置默认值null,让桥接层正确识别可选参数:

fun add(data: Double? = null) {
    // 处理参数逻辑,可直接判断data是否为null
}

这种方式可以保持单个函数的结构,同时支持无参数调用。

替代方案:使用ReadableMap封装参数

如果需要传递多个可选参数,或者统一参数格式,可以将参数封装到ReadableMap中,这种方式能稳定处理各种可选类型:

fun add(params: ReadableMap?) {
    val data = params?.getDouble("data") ?: 0.0
    // 逻辑处理
}

React Native端调用时传递对象:

add({ data: 123 });
// 或者不传参数
add();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 08:52:19