安卓工作室; Jetpack Compose:由于使用 rememberPermissionState 时出现错误,无法呈现预览

问题描述 投票:0回答:1

所以我在尝试使用 Accompanist 库请求权限时解决了这个问题。

这里是导致问题的代码片段,该函数是可组合的,也选择了实验性 API。

if (City.value == "") {
        /* val permissionState = rememberPermissionState(
            android.Manifest.permission.READ_EXTERNAL_STORAGE
        ) */
        Button(
            onClick = {
                //getPermissions(permissionState)
                pickLauncher.launch("application/vnd.ms-excel")
            },
            modifier = Modifier
                .weight(1f)
                .padding(10.dp),
        ) {
            Text("Select City")
        }
    }

每当我取消注释实现 rememberPermissionState 的行时,预览错误(尽管构建成功)并且在 Compose 错误选项卡中也没有给出任何内容。

为什么会这样?现在我只是在开发这个注释掉。

android android-studio kotlin android-jetpack-compose
1个回答
0
投票

如果您检查 compose 渲染问题,您会注意到以下错误:

java.lang.IllegalStateException: Permissions should be called in the context of an Activity
   at com.google.accompanist.permissions.PermissionsUtilKt.findActivity(PermissionsUtil.kt:138)
   at com.google.accompanist.permissions.MutablePermissionStateKt.rememberMutablePermissionState(MutablePermissionState.kt:51)
   at com.google.accompanist.permissions.PermissionStateKt.rememberPermissionState(PermissionState.kt:38)

作为解决方法,您可以实施

PermissionState
只是为了预览:

@OptIn(ExperimentalPermissionsApi::class)
class PreviewPermissionState(
    private val _permission: String = Manifest.permission.CAMERA,
    private val _status: PermissionStatus = PermissionStatus.Granted
) : PermissionState {
    override val permission: String
        get() = _permission
    override val status: PermissionStatus
        get() = _status

    override fun launchPermissionRequest() {
    }
}

然后你将不得不提升

rememberPermissionState

@Composable
@OptIn(ExperimentalPermissionsApi::class)
fun SettingsScreen(
    permissionState: @Composable (onPermissionResult: (Boolean) -> Unit) -> PermissionState,
) {
    val permissionState = permissionState {
        ..

        if (it) {
            activityResultLauncher.launch()
        }
    }
    ..
}

@Composable
@OptIn(ExperimentalPermissionsApi::class)
fun SettingsScreen() {
    SettingsScreen(permissionState = { onPermissionResult ->
        rememberPermissionState(Manifest.permission.CAMERA) {
            onPermissionResult(
                it
            )
        }
    })
}

现在您可以使用

PreviewPermissionState
预览
SettingsScreen

@Preview
@Composable
@OptIn(ExperimentalPermissionsApi::class)
fun SettingsScreenPreview() {
    SettingsScreen { PreviewPermissionState() }
}

这将允许 compose 正确渲染预览。确保检查呈现的问题是否存在其他问题。

© www.soinside.com 2019 - 2024. All rights reserved.