react-native-health-connect报错:lateinit property requestPermission未初始化
解决react-native-health-connect调用requestPermission时的初始化崩溃问题
问题重现
使用react-native-health-connect实现步行计步器功能,初始化后调用requestPermission申请权限时应用崩溃,报错:
lateinit property requestPermission has not been initialized
相关代码如下:
import { initialize, requestPermission, readRecords} from 'react-native-health-connect'; import { Permission } from 'react-native-health-connect/lib/typescript/types'; import { TimeRangeFilter } from 'react-native-health-connect/lib/typescript/types/base.types'; import {useEffect, useState} from 'react'; import { Platform } from 'react-native'; const useHealthData = () => { const [steps, setSteps] = useState(0); const [flights, setFlights] = useState(0); const [distance, setDistance] = useState(0); const [androidPermissions, setAndroidPermissions] = useState<Permission[]>([]); const init = async () => { // initialize the client const isInitialized = await initialize(); if (!isInitialized) { console.log('Failed to initialize Health Connect'); return; } // request permissions const grantedPermissions = await requestPermission([ { accessType: 'read', recordType: 'Steps' }, ]); setAndroidPermissions(grantedPermissions); }; useEffect(() => { if (Platform.OS !== 'android') { return; } init(); }, []); return {steps, flights, distance} }
问题原因
这个错误核心是权限请求方法未与初始化后的Health Connect客户端正确绑定,常见触发场景:
- API名称变更:新版本库将
requestPermission改为复数形式requestPermissions,旧方法已废弃或未正确初始化; - 异步时序问题:
initialize返回true但内部客户端未完成初始化,就立刻调用权限请求; - 版本兼容问题:低版本库存在初始化逻辑缺陷,导致方法未正确注入;
- 设备不支持Health Connect:未提前检查设备状态,导致初始化流程异常。
解决方案
1. 修正API调用(最常见解决方式)
将requestPermission替换为requestPermissions,同时增加设备支持性检查。
2. 完善初始化流程
用isHealthConnectAvailable提前确认设备支持Health Connect;添加try-catch捕获异常,方便排查问题。
3. 检查原生配置
确保AndroidManifest.xml添加了必要权限:
<uses-permission android:name="android.permission.health.READ_STEPS" />
并确认项目依赖的Health Connect版本与react-native-health-connect库兼容。
修正后的完整代码
import { initialize, requestPermissions, readRecords, isHealthConnectAvailable } from 'react-native-health-connect'; import { Permission } from 'react-native-health-connect/lib/typescript/types'; import { useEffect, useState } from 'react'; import { Platform } from 'react-native'; const useHealthData = () => { const [steps, setSteps] = useState(0); const [flights, setFlights] = useState(0); const [distance, setDistance] = useState(0); const [androidPermissions, setAndroidPermissions] = useState<Permission[]>([]); const init = async () => { // 检查设备是否支持Health Connect const isAvailable = await isHealthConnectAvailable(); if (!isAvailable) { console.log('当前设备不支持Health Connect,请安装或启用该应用'); return; } // 初始化客户端 const isInitialized = await initialize(); if (!isInitialized) { console.log('Health Connect初始化失败'); return; } // 请求步数读取权限 try { const grantedPermissions = await requestPermissions([ { accessType: 'read', recordType: 'Steps' }, ]); setAndroidPermissions(grantedPermissions); // 权限获取成功后可在此调用readRecords读取步数数据 } catch (error) { console.error('请求权限时出错:', error); } }; useEffect(() => { if (Platform.OS !== 'android') return; init(); }, []); return { steps, flights, distance }; };
额外建议
- 升级react-native-health-connect到最新稳定版本,规避旧版本已知bug;
- 测试时确保设备已安装并启用Health Connect应用;
- 权限请求失败时,引导用户前往系统设置手动开启权限。
内容的提问来源于stack exchange,提问作者Tareq A. Deeb
相关产品推荐
相关产品推荐

