我想显示一些数据并模拟加载。因此,我在第一个屏幕上使用 LaunchedEffect。它工作正常,但是当我添加导航时, LaunchedEffect 启动两次。
导航:第一个 (LaunchedEffect) -> 第二个 -> 返回第一个(LaunchedEffect 再次启动)
我希望当我返回第一个屏幕时 LaunchedEffect 将不会启动,我将立即看到数据。
启动效果示例:
@Composable
fun FirstScreen(...) {
...
LaunchedEffect(Unit) {
state = State.Loading
delay(2_000L)
state = State.Success(...)
}
}
Run Code Online (Sandbox Code Playgroud)
导航示例:
val navController = rememberNavController()
NavHost(
navController = navController,
startDestination = FIRST_ROTE
) {
composable(FIRST_ROTE) { FirstScreen(...) }
composable(SECOND_ROTE) { SecondScreen(...) }
}
Run Code Online (Sandbox Code Playgroud) 我需要实现下一个网格:
红色框的大小应取决于屏幕宽度。我尝试使用列和行:
@Composable
fun Component() {
Column(modifier = Modifier.fillMaxWidth()) {
Row {
repeat(5) {
if (it > 0) {
Spacer(modifier = Modifier.width(20.dp))
}
Box(modifier = Modifier
.aspectRatio(1f)
.weight(1f).background(Color.Red))
}
}
Spacer(modifier = Modifier.height(20.dp))
Row {
repeat(4) {
if (it > 0) {
Spacer(modifier = Modifier.width(20.dp))
}
val weight = if (it < 3) 1f else 2f
Box(modifier = Modifier
.aspectRatio(weight)
.weight(weight).background(Color.Red))
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但由于第二排少了一个空间,所以看起来并不完美。
如何使用合并单元格创建像素完美的网格视图?我了解 LazyGrid,但我不确定它是否合适,因为我的网格需要全屏。
我使用 Coil 库将图像加载到 Android 应用程序中。如果没有互联网,它会立即向我显示缓存的图像。但是当有互联网连接时,线圈会再次加载图像,并且有一段时间我会看到占位符。我认为这是一个非常奇怪的逻辑。即使有互联网连接,如何让它立即显示缓存的图像?
我当前的代码:
fun ImageView.setPhoto(photoLink: String) {
load(photoLink) {
crossfade(true)
placeholder(R.drawable.placeholder)
error(R.drawable.placeholder)
size(ViewSizeResolver(this@setPhoto))
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个简单的可组合函数,其中包含 LazyColumn:
@Composable
fun MyScreen(itemList: List<Item>) {
LazyColumn {
intems(itemList) {
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
一切都很好,但是itemList当滚动到达某个位置索引时,我的 ViewState( ) 应该改变。这就是为什么我将以下行添加到可组合函数中:
@Composable
fun MyScreen(itemList: List<Item>) {
val lazyListState = rememberLazyListState()
viewModel.onPositionChanged(lazyListState.firstVisibleItemIndex)
LazyColumn(state = lazyListState) {
intems(itemList) {
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
一切都按我的预期进行,但性能明显下降。我该如何修复它?
预期的字段或方法名称位于 ... -keepclassmembers class * { *** @null(android.view.View); }