首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >条件记忆失效

条件记忆失效
EN

Stack Overflow用户
提问于 2022-08-08 19:20:53
回答 1查看 44关注 0票数 0

当类的类型是特定类型时,我有一个可组合的,当类的类型是特定的类型时,我想在UI中/从UI中动画。

代码看起来是这样的。

代码语言:javascript
复制
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调用来实现这一点。

我有个解决办法..。

代码语言:javascript
复制
AnimatedVisibility(currentValue is MyType) {
   val value = currentComposer.cache(currentValue is MyType) { currentValue }

   if (value is MyType)
       MyComposable(myType = value)
}

但是,cache函数由remember显式标记为“不使用”。

是否有一种正确实现缓存函数的方法,或者更好地激活转换的方法?

我可以将值存储在MutableState中,并将其更新到SideEffect中,但这会使值更新滞后于一个框架。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-08 19:20:53

我想出了一个仅使用发布的API的解决方案。也许有一个更优雅的方式,但它在这里。

代码语言:javascript
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73282995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档