当类的类型是特定类型时,我有一个可组合的,当类的类型是特定的类型时,我想在UI中/从UI中动画。
代码看起来是这样的。
AnimatedVisibility(currentValue is MyType) {
if (currentValue is MyType) // required check as MyComposable only takes MyType
MyComposable(myType = currentValue)
}问题是,这将很好地动画,但它没有动画,因为当currentValue不是MyType时,AnimatedVisibility可组合是空的。
我真的需要remember currentValue的值,只要它是MyType,但是我不知道如何使用标准的remember调用来实现这一点。
我有个解决办法..。
AnimatedVisibility(currentValue is MyType) {
val value = currentComposer.cache(currentValue is MyType) { currentValue }
if (value is MyType)
MyComposable(myType = value)
}但是,cache函数由remember显式标记为“不使用”。
是否有一种正确实现缓存函数的方法,或者更好地激活转换的方法?
我可以将值存储在MutableState中,并将其更新到SideEffect中,但这会使值更新滞后于一个框架。
发布于 2022-08-08 19:20:53
我想出了一个仅使用发布的API的解决方案。也许有一个更优雅的方式,但它在这里。
private class Wrapper<T>(var value: T)
@Composable
fun <T> rememberConditionally(condition: Boolean, block: @DisallowComposableCalls () -> T): T? {
val wrapper = remember { Wrapper<T?>(null) }
if (condition)
wrapper.value = block()
return wrapper.value
}当condition为真时,它将返回新值并更新保存的值。当condition为false时,它将返回上次condition为true时的值。
如果condition从未为真,它将返回null。
https://stackoverflow.com/questions/73282995
复制相似问题