Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 值未更新(Jetpack Compose)_Android_Kotlin_Android Jetpack Compose - Fatal编程技术网

Android 值未更新(Jetpack Compose)

Android 值未更新(Jetpack Compose),android,kotlin,android-jetpack-compose,Android,Kotlin,Android Jetpack Compose,我正试图根据自己的需要改编一个视频教程。基本上,我有一个框列表,我希望每一个框都能在另一个框之后延迟1秒。我不明白为什么我的代码不起作用。 延迟值 似乎没有更新。有什么想法吗 @Composable fun Rocket( isRocketEnabled: Boolean, maxWidth: Dp, maxHeight: Dp ) { val modifier: Modifier val delay = remember { mutableSta

我正试图根据自己的需要改编一个视频教程。基本上,我有一个框列表,我希望每一个框都能在另一个框之后延迟1秒。我不明白为什么我的代码不起作用。

延迟值

似乎没有更新。有什么想法吗

    @Composable
fun Rocket(
    isRocketEnabled: Boolean,
    maxWidth: Dp,
    maxHeight: Dp
) {
    val modifier: Modifier
    val delay = remember { mutableStateOf(0) }
    val tileSize = 50.dp
    if (!isRocketEnabled) {
        Modifier.offset(
            y = maxHeight - tileSize,
        )
    } else {
        val infiniteTransition = rememberInfiniteTransition()
        val positionState = infiniteTransition.animateFloat(
            initialValue = 0f,
            targetValue = 1f,
            animationSpec = infiniteRepeatable(
                animation = tween(
                    durationMillis = 2000,
                    delayMillis = delay.value,
                    easing = LinearEasing
                )
            )
        )
        modifier = Modifier.offset(
            x = (maxWidth - tileSize) * positionState.value,
            y = (maxHeight - tileSize) - (maxHeight - tileSize) * positionState.value,
        )
        listOf(
            Color(0xffDFFF00),
            Color(0xffFFBF00),
            Color(0xffFF7F50),
            Color(0xffDE3163),
            Color(0xff9FE2BF),
            Color(0xff40E0D0),
            Color(0xff6495ED),
            Color(0xffCCCCFF),
        ).forEachIndexed { index, color ->
            Box(
                modifier = modifier
                    .width(tileSize)
                    .height(tileSize)
                    .background(color = color)
            )
            delay.value += 1000
        }
    }
}

当在可组合文件中记住的状态被更改时,整个可组合文件将被重新组合

因此,为了达到给定的要求

我们可以简单地使用
Int
延迟,在
forEach
循环中更新其值,并使用更新的延迟创建动画,而不是将延迟用作
mutableState

.forEachIndexed { index, color ->
            Box(
                modifier = createModifier(maxWidth, maxHeight, tileSize, createAnim(delay = delay))
                    .width(tileSize)
                    .height(tileSize)
                    .background(color = color)
            )
            delay += 1000
        }
使用动画创建修改器:-

fun createModifier(maxWidth: Dp, maxHeight: Dp, tileSize: Dp, positionState: State<Float>): Modifier {
    return  Modifier.offset(
        x = ((maxWidth - tileSize) * positionState.value),
        y = ((maxHeight - tileSize) - (maxHeight - tileSize) * positionState.value),
    )
}

@Composable
fun createAnim(delay: Int): State<Float> {
    val infiniteTransition = rememberInfiniteTransition()
    return infiniteTransition.animateFloat(
        initialValue = 0f,
        targetValue = 1f,
        animationSpec = infiniteRepeatable(
            animation = tween(
                durationMillis = 2000,
                delayMillis = delay,
                easing = LinearEasing
            )
        )
    )
}
fun createModifier(maxWidth:Dp,maxHeight:Dp,tileSize:Dp,positionState:State):修饰符{
返回修饰符.offset(
x=((maxWidth-tileSize)*positionState.value),
y=((maxHeight-tileSize)-(maxHeight-tileSize)*positionState.value),
)
}
@组合的
趣味createAnim(延迟:Int):状态{
val infiniteTransition=rememberInfiniteTransition()
return infiniteTransition.animateFloat(
初始值=0f,
targetValue=1f,
animationSpec=无限重复(
动画=吐温(
持续时间毫秒=2000,
delayMillis=延迟,
放松=线性化
)
)
)
}

更改可组合程序中记住的状态将重新组合整个函数,而不是使用延迟作为
可变状态
使用简单的
Int
并在
forEach
循环中创建动画。谢谢,请将其作为答案,以便我可以接受它:-)