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

