React Native Android生产环境setSpan异常崩溃无法复现 求解决方案
采集到的崩溃日志如下:
Fatal Exception: java.lang.IndexOutOfBoundsException setSpan (2 ... 2) ends beyond length 0 Environment Details: "react": "16.13.1", "react-native": "0.63.0",
问题原因说明
该崩溃是React Native 0.63.0~0.63.3版本Android端TextInput组件的已知原生层bug,触发条件为:给空内容的输入框快速设置光标位置/selection属性时,原生逻辑未校验当前文本长度就直接调用setSpan方法,导致下标越界。调试环境难复现是因为只有在JS线程卡顿、操作过快导致value更新和selection设置不同步时才会触发,生产用户操作场景更复杂所以更容易命中。
解决方案
永久修复方案
- 直接将React Native版本升级到0.63.4及以上,官方已经在该版本修复了这个光标越界问题,无额外兼容成本。
临时规避方案(暂时无法升级RN版本时使用)
- 所有动态修改TextInput的
selection属性、调用focus()自动定位光标的逻辑,先校验当前输入框绑定的value长度是否大于要设置的selection的起始、结束下标,满足条件再执行对应操作。 - 全局统一TextInput的value传值规范,禁止传入
null/undefined作为空值,空内容统一传入空字符串""。 - 可自定义封装全局通用TextInput组件,在原生层添加拦截逻辑:调用Android原生
Spannable.setSpan方法前,先判断当前文本长度是否大于span的结束位置,若小于则直接将span的范围截断到当前文本长度。
内容的提问来源于stack exchange,提问作者Raghav Sahni
相关产品推荐
相关产品推荐

