You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose中LaunchEffect调用@Composable函数报错及写法咨询

问题:Jetpack Compose中在LaunchedEffect内调用Composable组件引发错误

我在Jetpack Compose中实现了自定义涟漪效果,编写了对应的函数并将其应用到Material按钮。但当我在LaunchedEffect内调用该Material按钮组件时,触发了如下错误:

@Composable invocations can only happen from the context of a @Composable function

我尝试过两篇Stack Overflow的解决方案,但均无效。

自定义涟漪效果函数

@OptIn(ExperimentalMaterialApi::class)
@Composable
fun ClickableItemContainer(
    rippleColor: Color = TealLight,
    content: @Composable (MutableInteractionSource) -> Unit,
    clickAction: () -> Unit
) {
    val interactionSource = remember { MutableInteractionSource() }
    var userClickAction by remember { mutableStateOf(false) }
    if (userClickAction) {
        clickAction()
    } else {
        CompositionLocalProvider(
            AbcRippleTheme provides AbcRippleTheme(rippleColor),
            content = {
                Surface(
                    onClick = { userClickAction = true },
                    interactionSource = interactionSource,
                    indication = rememberRipple(true),
                    color = White
                ) {
                    content(interactionSource)
                }
            }
        )
    }
}

应用涟漪效果的Material按钮组件

@Composable
fun AbcMaterialButton(
    text: String,
    spacerHeight: Dp,
    onActionClick: () -> Unit
) {
    Spacer(modifier = Modifier.height(spacerHeight))
    var userActionClick by remember { mutableStateOf(false) }
    if (userActionClick) {
        onActionClick()
    } else {
        ClickableItemContainer(rippleColor = AquaDarker, content = {
            Box(
                modifier = Modifier
                    .clip(RoundedCornerShape(10.dp))
                    .background(Aqua)
                    .fillMaxWidth(),
            ) {
                Text(
                    text = text,
                    modifier = Modifier
                        .padding(10.dp)
                        .align(Alignment.Center)
                )
            }
        }) {
            userActionClick = true
        }
    }
}

引发错误的组件调用代码

@Composable
fun BluetoothRequestContinue(multiplePermissionsState: MultiplePermissionsState) {
    LaunchedEffect(multiplePermissionsState) {
        AbcMaterialButton(
            text = stringResource(R.string.continue_text),
            spacerHeight = 10.dp
        ) {
            multiplePermissionsState.launchMultiplePermissionRequest()
        }
    }
}

错误截图

尝试的修正代码

根据建议,我修改了调用代码如下:

@Composable
fun BluetoothRequestContinue(multiplePermissionsState: MultiplePermissionsState) {
    var launchPermission by remember { mutableStateOf(false) }
    if (launchPermission) {
        LaunchedEffect(Unit) {
            multiplePermissionsState.launchMultiplePermissionRequest()
        }
    } else {
        AbcMaterialButton(
            text = stringResource(R.string.continue_text),
            spacerHeight = 10.dp
        ) {
            launchPermission = true
        }
    }
}

请问这种写法是否存在问题?


内容的提问来源于stack exchange,提问作者Compose Learner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:10:35