android 在单独的Jetpack Compose Composables中调用时,ViewModel结构不维护变量值

j1dl9f46  于 2024-01-04  发布在  Android
关注(0)|答案(2)|浏览(184)

DiscoverCountries可组合页面中,有一个按钮可组合,用于更新ContinentsViewModel ViewModel()类的selectedContinent字符串成员的值。我试图在不同文件的不同可组合函数中使用更新后的字符串,但仍保留默认的空字符串。
当这个特定的按钮被点击时,它传递viewModel1.selectContinent("North America")函数来执行,改变视图模型中字符串的值。

  1. class ContinentsViewModel : ViewModel() {
  2. val selectedContinent: MutableState<String> = mutableStateOf("")
  3. fun selectContinent(continent: String) {
  4. selectedContinent.value = continent
  5. Log.d("ViewModel", "Continent selected: $continent")
  6. }
  7. }

个字符
下面是函数定义的相关代码片段:

  1. @Composable
  2. fun ContinentsCard(navController: NavHostController, continentName: String, onContinentSelected: () -> Unit) {
  3. Row(
  4. modifier = Modifier
  5. .fillMaxWidth()
  6. .height(67.dp)
  7. .clickable{
  8. onContinentSelected()
  9. navController.navigate(ScreenView.ContinentsCountriesPage.route)
  10. }


按钮确实正确导航到ContinentsCountriesPage,但视图模型中的“North America”字符串没有被维护,它被视为来自目标组合的空字符串。

  1. @Composable
  2. fun ContinentsCountriesPage(navController: NavHostController){
  3. Log.d("ViewModelTest", "Page Opened")
  4. val viewModel1: ContinentsViewModel = viewModel()
  5. val selectedContinent = viewModel1.selectedContinent.value
  6. Log.d("ViewModel", "Continent selected: $selectedContinent")
  7. Log.d("ViewModelTest", "ContinentsCountries ViewModel: ${viewModel1.hashCode()}")


我尝试了控制台记录selectedContinent的值,该值在DiscoverCountries代码文件中正确更新,但在ContinentsCountriesPage文件中为空字符串。我确保了视图在同一个导航主机控制器下。当记录每个文件中视图模型的hashCode时,它们是不同的,我不确定它们是否应该是相同的hashCode。

omqzjyyz

omqzjyyz1#

您可以考虑将字符串作为导航参数传递,如下所述:使用参数导航。
或者,您可以创建一个应用级别ViewModel。为此,您可以将ComponentActivity作为ViewModelStoreOwner函数传递给viewModel。要查找父Activity,您可以使用此函数(source):

  1. fun Context.findActivity(): ComponentActivity? = when (this) {
  2. is ComponentActivity -> this
  3. is ContextWrapper -> baseContext.findActivity()
  4. else -> null
  5. }
  6. val appViewModel: AppViewModel = viewModel(LocalContext.current.findActivity()!!)

字符串

yeotifhr

yeotifhr2#

在ViewModel类中,尝试替换此行:

  1. val selectedContinent: MutableState<String> = mutableStateOf("")

字符串
对于这一个:

  1. var selectedContinent: MutableState<String> = mutableStateOf("")
  2. private set


这意味着您的变量仅可用于ViewModel外部的read,但read & write可用于ViewModel内部。

相关问题