Flutter 3.10.6 iOS端RangeError(length)注册崩溃问题排查求助
问题原因及解决方案
根因分析
你遇到的RangeError (length): Invalid value: Only valid value is 0: 1错误,确实由isUSA的判断代码导致。
当部分iOS设备的系统Locale为单段格式(比如"en"、"fr")时,Intl.systemLocale.split('_')返回长度为1的数组,此时直接访问索引[1]会触发数组越界错误。这个错误会在创建MyModel.empty()实例时触发——因为初始化temperatureScale时会调用TemperatureScale.defaultValue,而defaultValue依赖isUSA的计算结果。
修复方案
修改isUSA的判断逻辑,先检查分割后的数组长度,再访问对应索引:
static bool isUSA = () { final localeParts = Intl.systemLocale.split('_'); // 先判断是否存在第二部分,再检查是否为US if (localeParts.length >= 2) { return localeParts[1].toUpperCase() == 'US'; } // 处理单段Locale的情况 final platformLocaleParts = Platform.localeName.split('_'); return platformLocaleParts.length == 1; }();
或者更简洁的写法:
static bool isUSA = (Intl.systemLocale.split('_').length >= 2 && Intl.systemLocale.split('_')[1].toUpperCase() == 'US') || Platform.localeName.split('_').length == 1;
额外优化建议
后续处理数组索引访问时,建议先判断数组长度是否足够,避免类似越界问题。比如处理Locale相关逻辑时,始终先确认分割后的数组长度再访问对应位置。
内容的提问来源于stack exchange,提问作者Ryan Heitner
相关产品推荐
相关产品推荐

