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
相关产品推荐
相关产品推荐

