Flutter使用new_version包触发RangeError(index)错误求助
解决new_version ^0.3.1包的RangeError异常问题
异常信息
[ERROR:flutter/lib/ui/ui_dart_state.cc(198)] Unhandled Exception: RangeError (index): Invalid value: Valid value range is empty: 1 E/flutter ( 5988): #0 List.[] (dart:core-patch/growable_array.dart:264:36) E/flutter ( 5988): #1 NewVersion._getAndroidStoreVersion (package:new_version/new_version.dart:195:26) E/flutter ( 5988): <asynchronous suspension> E/flutter ( 5988): #2 _SplashScreenState._checkVersion (package:cardicare/appScreens/Splash_Screen.dart:124:20)
问题代码
void _checkVersion() async { final newVersion = NewVersion ( androidId: androidAppId, iOSId: iOSAppId ); final status = await newVersion.getVersionStatus(); if(status!=null) { if(status.canUpdate) { newVersion.showUpdateDialog ( context: context, versionStatus: status, dialogTitle: "Update!!!", //dismissButtonText: "Skip", dialogText: "Please update your app from "+"${status.localVersion}"+ " to "+ "${status.storeVersion}", allowDismissal: false, dismissAction: () { SystemNavigator.pop(); }, updateButtonText: "Let's Update" ); } print("app version on Device "+"${status.localVersion}"); print("app version on store "+"${status.storeVersion}"); } }
问题原因
这个异常是因为new_version 0.3.1版本在解析Google Play商店页面时,未能找到存储版本号的DOM元素,导致代码尝试访问空列表的索引1,触发RangeError。常见诱因包括:
- 应用ID填写错误,导致请求到错误的商店页面
- Google Play页面结构更新,旧版本包的解析逻辑失效
- 网络请求失败,未正确加载商店页面内容
解决方案
1. 验证应用ID正确性
确认androidAppId是Google Play商店中你的应用的完整包名(例如com.yourcompany.yourapp),检查是否存在拼写错误或格式问题。
2. 升级new_version包到最新版本
旧版本的解析逻辑存在兼容性问题,新版本已经修复了这类页面解析错误。修改pubspec.yaml中的依赖:
dependencies: new_version: ^最新版本号
执行flutter pub get完成依赖更新。
3. 添加异常捕获逻辑
在版本检测代码中添加try-catch块,避免未处理异常导致应用崩溃,并添加降级逻辑:
void _checkVersion() async { final newVersion = NewVersion( androidId: androidAppId, iOSId: iOSAppId ); try { final status = await newVersion.getVersionStatus(); if (status != null) { if (status.canUpdate) { newVersion.showUpdateDialog( context: context, versionStatus: status, dialogTitle: "Update!!!", dialogText: "Please update your app from ${status.localVersion} to ${status.storeVersion}", allowDismissal: false, dismissAction: () { SystemNavigator.pop(); }, updateButtonText: "Let's Update" ); } print("app version on Device ${status.localVersion}"); print("app version on store ${status.storeVersion}"); } } catch (e) { print("版本检测失败: $e"); // 异常时直接进入应用,避免卡在闪屏页 // Navigator.pushReplacement(context, MaterialPageRoute(builder: (ctx) => HomeScreen())); } }
4. 备选方案:使用官方in_app_update包
如果new_version的问题持续,推荐使用Flutter官方支持的in_app_update包,它直接调用Google Play的更新API,无需解析网页,稳定性更高。
内容的提问来源于stack exchange,提问作者Ganesh
相关产品推荐
相关产品推荐

