我发现一篇文章介绍了如何在LazyColumn中实现视差视图,有这样的方法:
@Composable
fun ImageParallaxScroll() {
val lazyListState = rememberLazyListState()
val list = (0..1_000).map{ "Item $it" }.toList()
val firstItemTranslationY: LazyListState by remember {
derivedStateOf {
when {
lazyListState.layoutInfo.visibleItemsInfo.isNotEmpty() && lazyListState.firstVisibleItemIndex == 0 -> lazyListState.firstVisibleItemScrollOffset * .6f
else -> 0f
}
}
}
...
}
问题是整个
remember
块都带有红线下划线,出现这样的错误:
Type 'TypeVariable(T)' has no method 'getValue(Nothing?, KProperty<*>)' and thus it cannot serve as a delegate
不明白这里出了什么问题?
我可以在这里看到一些东西......
首先:
您需要导入:
import androidx.compose.runtime.getValue
或者使用以下命令导入所有内容:
import androidx.compose.runtime.*
这将导入您缺少的
State<T>
上的扩展运算符函数(来自 SnapshotState.kt 文件)。
由于某种原因,IDE 似乎很难自动导入顶级扩展函数。
不确定为什么它
inlined
但这可能就是不只是将其添加到State<T>
接口而是具有松散的顶级功能,需要额外导入的原因。
其次:
我相信返回类型是will
Float
而不是LazyListState
。
因此,带有导入的函数将是(还记住列表本身,以便在重组时不会重新计算):
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
@Composable
fun ImageParallaxScroll() {
val lazyListState = rememberLazyListState()
val list = remember { (0..1_000).map{ "Item $it" }.toList() }
val firstItemTranslationY: Float by remember {
derivedStateOf {
when {
lazyListState.layoutInfo.visibleItemsInfo.isNotEmpty() && lazyListState.firstVisibleItemIndex == 0 -> lazyListState.firstVisibleItemScrollOffset * .6f
else -> 0f
}
}
}
...
}
在你的 build.graddle 项目级别将 compose 版本更新到最后一个
buildscript {
ext {
compose_version = '1.4.0'
}
}
并升级kotlin.android插件版本
plugins {
id 'com.android.application' version '7.4.1' apply false
id 'com.android.library' version '7.4.1' apply false
id 'org.jetbrains.kotlin.android' version '1.8.10' apply false
}
看起来像是版本兼容性问题
执行此操作可能需要更新 build.gradle 中声明的一些实现版本应用程序级别