繁体   English   中英

Jetpack Compose state 更改未反映在活动中

[英]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访问

您需要使用BundleActivities之间传递hasChanged ,或者拥有 Singleton 存储库或 UseCase class ,您可以将其注入两个 ViewModel 或使用本地数据库或其他方法在活动之间传递数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM