如何在喷气背包中开始新的活动



我想在jetpack compose中开始新的活动。所以我想知道在喷气背包写作中惯用的方法是什么。打开时是否需要使用任何副作用api。

ClickableItemContainer.kt

@OptIn(ExperimentalMaterialApi::class)
@Composable
fun ClickableItemContainer(
rippleColor: Color = TealLight,
content: @Composable (MutableInteractionSource) -> Unit,
clickAction: () -> Unit
) {
val interactionSource = remember { MutableInteractionSource() }
CompositionLocalProvider(
LocalRippleTheme provides RippleTheme(rippleColor),
content = {
Surface(
onClick = { clickAction() },
interactionSource = interactionSource,
indication = rememberRipple(true),
color = White
) {
content(interactionSource)
}
}
)
}

物料按钮.kt

@Composable
fun MaterialButton(
text: String,
spacerHeight: Dp,
onActionClick: () -> Unit
) {
Spacer(modifier = Modifier.height(spacerHeight))
ClickableItemContainer(rippleColor = AquaDarker, content = {
Box(
modifier = Modifier
.background(Aqua)
.fillMaxWidth(),
) {
Text(
text = text,
modifier = Modifier
.align(Alignment.Center),
style = WhiteTypography.h5
)
}
}) {
onActionClick()
}
}

OpenPermissionSetting.kt

@Composable
fun OpenPermissionSetting(router: Router = get()) {
val activity = LocalContext.current as Activity
MaterialButton(
text = "Open Setting",
spacerHeight = 10.dp
) {
activity.startActivity(Intent(this@CurrentClassName,RequiredClassName::class.java)
}
}

所以我的问题是,这种意图应该用于任何副作用,即LaunchEffect?

LaunchedEffect(key1 = true){
activity.startActivity(Intent(this@CurrentClassName,RequiredClassName::class.java)
}

感谢

@Composable
fun OpenPermissionSetting(router: Router = get()) {
val activity = LocalContext.current as Activity
MaterialButton(
text = "Open Setting",
spacerHeight = 10.dp
) {
activity.startActivity(Intent(this@CurrentClassName,RequiredClassName::class.java)
}
}

当点击按钮时,这个会打开新的活动

var startNewActivity by remember {mutabelStateOf(false)}
@Composable
fun OpenPermissionSetting(router: Router = get()) {
MaterialButton(
text = "Open Setting",
spacerHeight = 10.dp
) {
startActivity = true
}
}

LaunchedEffect(key1 = startActivity){
if(startActivity) {
activity.startActivity(Intent(this@CurrentClassName,RequiredClassName::class.java)
}
}

一旦您的Composable进入composition,这个就打开活动。设置true、false、Unit键或任何键都不会改变LaunchedEffect中的代码在进入composite时将被调用的事实。但是,您可以使用LaunchedEffect中的一个或多个键和一个条件语句来更改何时再次运行该代码。

LaunchedEffect(key1 = true){
activity.startActivity(Intent(this@CurrentClassName,RequiredClassName::class.java)
}

您应该了解用例SideEffect api是如何工作的,并问问自己这是否适用于我的情况。

SideEffect适用于只希望在合成成功的情况下发生动作的情况。如果,即使很小的可能性,您的状态变化很快,并且当前的组合被忽略,那么您也不应该调用该操作,例如,记录组合计数是SideEffect函数的一个非常好的用例。

Compose认为可堆肥可能已经改变了。推荐是乐观的意味着Compose希望在参数之前完成重新组合再次改变。如果参数在重新组合之前确实发生了更改完成,Compose可能会取消重新组合,并使用新参数。

取消重新组合时,Compose将从重组。如果您有任何依赖于UI的副作用显示时,即使构图也会产生副作用已取消。这可能导致应用程序状态不一致。

确保所有可组合函数和lambda都是幂等的,并且副作用免费处理乐观重组。

LaunchedEffect适用于您希望有一个用于动画、滚动或调用其他挂起函数的协同作用域的情况。LaunchedEffect的另一个用例是在您设置的一个或多个关键点发生更改时触发一次性操作。

和上面的示例一样,如果您为LaunchedEffect设置了key,并在代码块中检查它是否为true,则可以触发仅操作条件为true。当不需要用户交互但发生状态更改并且只需要触发一次的操作时,LaunchedEffect也很有用。

只有在没有用户交互的情况下达到特定状态时才执行回调

当您希望检查可堆肥何时进入和退出构图时,DisposableEffect是必需的。onDispose函数还可用于清除资源或回调、传感器寄存器,或在Composable退出重新组合时需要清除的任何内容。

组件被设计为只在层次结构中向下传播状态,而在层次结构上向上传播操作。所以,不,你不应该从堆肥中启动活动。你需要触发一个回调,比如你的onActionClick: () -> Unit,到你的可组合文件所在的原始ComponentActivity(如果这必须经过几个嵌套的可组合,你需要一直支持这个动作(。然后,在您的活动中,您可以指导它处理所选的操作。类似这样的东西:

在组件活动中:

ClickableItemContainer(
rippleColor = ...,
content = ...,
clickAction = {
startActivity(...)
}
)

我只使用带有标志的LaunchedEffect,比如val showActivity: BooleanLaunchedEffect函数看起来像:

@Composable
fun OpenPermissionSetting(viewModel: ViewModel) {
val uiState = viewModel.uiState
MaterialButton(
text = "Open Setting",
spacerHeight = 10.dp
) {
viewModel.onShowActivity()
}
}

LaunchedEffect(showActivity){
if (uiState.showActivity) {
activity.startActivity(...)
viewModel.onShowActivityDone()
}
}

记住不要将标志保留为true,因为如果你有更多的回报,这可能会导致一些问题:(

最新更新