使用health 10.2.0读取无数据日期的Health Connect时Flutter应用崩溃
Flutter health包请求无数据日期范围崩溃的问题解决
问题本质
这是health ^10.2.0包的底层bug。从Android堆栈跟踪能看到,崩溃源于HealthPlugin.kt第3297行的convertRecord方法抛出NullPointerException——当请求的日期范围内没有HealthDataType.NUTRITION类型的数据时,插件在转换Health Connect返回结果时未处理null值,直接导致应用崩溃。
临时规避方案
在官方修复前,用以下方法避免崩溃:
1. 捕获异常
在调用数据获取方法时用try-catch包裹,拦截异常并做兜底处理:
var now = DateTime.now(); var types = [HealthDataType.NUTRITION]; bool requested = await Health().requestAuthorization(types); List<HealthDataPoint> healthData = []; try { healthData = await Health().getHealthDataFromTypes( startTime: now.subtract(Duration(days: 4)), endTime: now, types: types ); } catch (e) { // 无数据或获取失败时的逻辑,比如提示用户或保持空列表 print("健康数据获取失败: $e"); }
2. 提前检测数据存在性
如果需要提前判断是否有数据,可先调用hasData方法(会增加一次API调用):
bool hasNutritionData = await Health().hasData(HealthDataType.NUTRITION); if (hasNutritionData) { // 有数据时再执行获取逻辑 healthData = await Health().getHealthDataFromTypes(...); } else { // 无数据时直接返回空列表或提示用户 }
彻底解决建议
- 向
health包的官方仓库提交Issue,附上你的复现步骤和完整堆栈信息,推动开发者修复空指针问题。 - 若有Kotlin开发能力,可fork仓库自行修复:定位到
HealthPlugin.kt第3297行,给可能为null的变量添加非空判断(比如用?.或配合空检查),再执行转换逻辑。
内容的提问来源于stack exchange,提问作者Leonardbd
相关产品推荐
相关产品推荐

