![](/img/trans.png)
[英]Jetpack Compose - preserve state of AndroidView on configuration change
[英]Jetpack Compose state change not reflected across activities
我有一个包含两个活动的应用程序。 Activity1
更改存储在ViewModel
中的State
,然后启动Activity2
。 但不知何故, state 更改仅反映在Activity1
中,而不反映在Activity2
中。
视图模型
class MyViewModel : ViewModel() {
var hasChanged: Boolean by mutableStateOf(false)
}
Activity1 的可组合
@Composable
fun Screen1() {
val context = LocalContext.current
val viewModel: MyViewModel = viewModel()
Column {
Text("State changed: " + viewModel.hasChanged.toString())
Button(
onClick = {
viewModel.hasChanged = true
startActivity(context, Intent(context, Activity2::class.java), null)
}
) {
Text("Change State!")
}
}
}
Activity2的可组合
@Composable
fun Screen2() {
val viewModel: MyViewModel = viewModel()
Text("State changed: " + viewModel.hasChanged.toString()) # stays 'false'
}
应用程序的行为
Activity1
最初正确显示 state 为false
Activity1
正确显示 state 为true
Activity2
打开但仍显示 state 为false
问题
为什么 state 更改未反映在Activity2
中,可以修复吗?
ViewModel 是实现ViewModelStoreOwner
的类所独有的
@Composable
public inline fun <reified VM : ViewModel> viewModel(
viewModelStoreOwner: ViewModelStoreOwner = checkNotNull(LocalViewModelStoreOwner.current) {
"No ViewModelStoreOwner was provided via LocalViewModelStoreOwner"
},
key: String? = null,
factory: ViewModelProvider.Factory? = null,
extras: CreationExtras = if (viewModelStoreOwner is HasDefaultViewModelProviderFactory) {
viewModelStoreOwner.defaultViewModelCreationExtras
} else {
CreationExtras.Empty
}
ComponentActivity
实现了ViewModelStoreOwner
,因此它是一个ViewModelStoreOwner
,它包含自己的ViewModel
实例,并使用HashMap
为作为字符串提供的键获取相同的ViewModel
。
val vm: MyViewModel = ViewModelProvider(owner = this)[MyViewModel::class.java]
这就是它们在引擎盖下的创建方式。 这里是 Activity 或 Fragment,取决于 ViewModelProvider 的所有者参数的设置位置。 在 Compose ViewModelStore 所有者由LocalViewModelStoreOwner.current
访问
您需要使用Bundle
在Activities
之间传递hasChanged
,或者拥有 Singleton 存储库或 UseCase class ,您可以将其注入两个 ViewModel 或使用本地数据库或其他方法在活动之间传递数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.