Android Studio中使用Accompanist权限时Compose Preview异常
问题解决:Compose预览中使用Accompanist权限组件报错
问题原因
Compose预览的沙箱环境没有提供真实的Activity实例,而Accompanist权限库的rememberMultiplePermissionsState必须依赖Activity上下文才能初始化,所以预览时会抛出Permissions should be called in the context of an Activity异常。
解决办法
方法一:预览模式下使用模拟权限状态
通过LocalInspectionMode.current判断是否处于预览模式,预览时返回模拟的权限状态,避免初始化真实的权限组件:
@Composable fun LocationPermissionScreen() { val isPreview = LocalInspectionMode.current val locationPermissionsState = if (isPreview) { // 模拟权限已授予的状态,可根据需要调整 object : MultiplePermissionsState { override val permissions: List<PermissionState> = listOf( object : PermissionState { override val permission: String = Manifest.permission.ACCESS_FINE_LOCATION override val hasPermission: Boolean = true override val shouldShowRationale: Boolean = false override fun launchPermissionRequest() {} }, object : PermissionState { override val permission: String = Manifest.permission.ACCESS_COARSE_LOCATION override val hasPermission: Boolean = true override val shouldShowRationale: Boolean = false override fun launchPermissionRequest() {} } ) override val allPermissionsGranted: Boolean = true override fun launchMultiplePermissionRequest() {} } } else { rememberMultiplePermissionsState( listOf( Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION ) ) } // 后续UI逻辑 if (locationPermissionsState.allPermissionsGranted) { Text("位置权限已授予") } else { Button(onClick = { locationPermissionsState.launchMultiplePermissionRequest() }) { Text("请求位置权限") } } }
方法二:拆分组件,预览时显示占位UI
把权限相关逻辑封装到单独的Composable中,预览模式下只显示占位内容:
@Composable fun PermissionWrapper() { val isPreview = LocalInspectionMode.current if (isPreview) { Text("预览模式:权限组件占位") } else { val locationPermissionsState = rememberMultiplePermissionsState( listOf( Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION ) ) PermissionContent(locationPermissionsState) } } @Composable fun PermissionContent(permissionsState: MultiplePermissionsState) { // 这里编写权限相关的UI逻辑 if (permissionsState.allPermissionsGranted) { Text("权限已就绪") } else { Button(onClick = permissionsState::launchMultiplePermissionRequest) { Text("申请权限") } } }
内容的提问来源于stack exchange,提问作者Talha Akbar
相关产品推荐
相关产品推荐

