if (res.isNullOrEmpty().not()) {
AsyncImage(model = res?.get(0)?.path, contentDescription = null)
}
// 定义按压相关和颜色
val interactionSource = remember { MutableInteractionSource() }
val isPressed by interactionSource.collectIsPressedAsState()
val color = if (isPressed) Color.Blue else Color.Green
// 需要使用 Button
Button(
interactionSource = interactionSource,
colors = ButtonDefaults.buttonColors(containerColor = color),
onClick = { },
) {
Text(text = "Button")
}
注意按压效果与 Ripple 效果不完全一致,Ripple 是有透明度的
// 可以设置给任意UI可组合件
modifier = Modifier
.background(colorResource(id = R.color.wx_foreground))
.clickable(
// 点击事件的水波纹效果
indication = rememberRipple(color = colorResource(id = R.color.wx_foreground_pressed)), // 透明度的颜色
// indication = null, // 去除 ripple 效果
interactionSource = remember { MutableInteractionSource() },
) {
ToastUtils.showShort("点击")
}
页码 page
错乱,而 pagerState.currentPage
执行多次 最后是正确的 index。使用 if (page != pagerState.currentPage)
来判断 可避免数据错乱问题
HorizontalPager(
state = pagerState,
modifier = Modifier
.fillMaxSize()
.weight(1f),
) { page ->
// 由于异步更新和页面预渲染等原因,HorizontalPager 的 page 和 pagerState.currentPage 可能会不同步
if (page != pagerState.currentPage) {
return@HorizontalPager
}
val item = projectTree[pagerState.currentPage]
LaunchedEffect(item) { // 当 参数 item 变化时 会重新执行
println("request id=${item?.id} name=${item?.nameDecoded}")
// 请求网络
// viewModel.fetchList(item?.id)
}
val list by viewModel.list.collectAsState()
LazyColumn {
items(list) {
Text(text = it.title)
}
}
}
问题:一般情况下,
LaunchedEffect(Unit)
不会执行)LaunchedEffect(Unit)
会执行)处理办法:重写返回事件并带上返回参数,同时强制返回页面时一定重新渲染(起码状态发生变化会重组)。返回后可以读取返回参数再做进一步处理
将要返回的页面
val navController = LocalNavController.current
BackHandler {
if(param != null) { // param 是传过来的参数,根据实际情况确定是否需要使用它来判断页面来源
navController.previousBackStackEntry?.savedStateHandle?.set("refresh", true)
}
navController.popBackStack()
}
返回到的页面
val refresh = navController.currentBackStackEntry
?.savedStateHandle
?.getLiveData<Boolean>("refresh")
?.observeAsState()
// 监听 refresh?.value 的变化,并在 refresh 为 true 时触发逻辑
LaunchedEffect(refresh?.value) {
if (refresh?.value == true) {
// 强制触发页面重新渲染的逻辑
// 比如重新加载数据
// 当渲染完成后,可以将值重置
navController.currentBackStackEntry?.savedStateHandle?.set("refresh", false)
}
}