我发现了一篇文章,其中描述了如何在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>
接口,而是具有松散的顶层功能的原因,需要额外的导入。
第二:
我相信返回类型将是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
}
}
}
...
}
在您的构建中.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应用程序级别中声明的一些实现版本