在Jetpack Compose中,是否有类似rememberSaveable
的东西,但不保存到磁盘,所以它像viewModel()
一样工作?目前我有这个:
class MyViewModel : ViewModel() {
var initialized: Boolean = false
var needsToBeInitialized = mutableStateOf<Boolean?>(null)
}
@Composable
func HelloWorld() {
val model: MyViewModel = viewModel()
// this needs to survive device rotation
var needsToBeInitialized by model.needsToBeInitialized
if (!model.initialized) {
model.needsToBeInitialized.value = getBooleanOrNullSomehow()
model.initialized = true
}
}
对于rememberSaveable
,它只是一个很好的一行程序,所以我在想是否可以在一行中实现类似viewModel()
的东西,所以它将数据存储在内存中。
2条答案
按热度按时间vh0rcniy1#
您可以通过创建一个自定义的remember函数来实现您所描述的功能,该函数使用一个“泛型”ViewModel类,该类将分配给它的任何状态保存在内存中。
“通用”ViewModel和自定义记住函数(我称之为
rememberInMemory
)当调用
rememberInMemory
时,必须提供一个字符串作为dataKey
参数。此键将用于获取当前存储的值。如果给定的dataKey
还没有存储值,init
lambda将被调用以获得初始值,该初始值将被存储并返回。inputs
是可选的可变长度参数,当它们中的任何一个发生变化时,它将导致init
lambda再次被调用以获得新值,该值将被存储并返回。保存在内存中的数据的作用域将与默认的
ViewModel
作用域相同,这意味着此函数将与ViewModel
方法相同。当使用导航时,
StateMapViewModel
将被限制到每个NavBackStackEntry
。这意味着每次导航到新的目标时,都会创建一个新的StateMapViewModel
示例,而当向后或向上导航时,将使用先前NavBackStackEntry
中的现有StateMapViewModel
示例。因此,即使使用导航,这种方法也将与直接使用ViewModel
相同。如果您使用的是依赖注入框架,请将
rememberInMemory
函数中的viewModel()
调用替换为框架中正确的viewModel()
/getViewModel()
调用。下面是一个演示应用程序,展示了如何处理范围为3个不同导航目的地的数据以及范围为其父级的一些数据。
由于演示使用的是Compose Navigation,因此您必须向
app/build.gradle
添加依赖项才能尝试该演示。MainActivity.kt
Demo.kt
c90pui9n2#
我改进了@Ma3x的答案,将
dataKey
设为可选,并删除了takeIf
: