在DiscoverCountries
可组合页面中,有一个按钮可组合,用于更新ContinentsViewModel
ViewModel()类的selectedContinent
字符串成员的值。我试图在不同文件的不同可组合函数中使用更新后的字符串,但仍保留默认的空字符串。
当这个特定的按钮被点击时,它传递viewModel1.selectContinent("North America")
函数来执行,改变视图模型中字符串的值。
class ContinentsViewModel : ViewModel() {
val selectedContinent: MutableState<String> = mutableStateOf("")
fun selectContinent(continent: String) {
selectedContinent.value = continent
Log.d("ViewModel", "Continent selected: $continent")
}
}
个字符
下面是函数定义的相关代码片段:
@Composable
fun ContinentsCard(navController: NavHostController, continentName: String, onContinentSelected: () -> Unit) {
Row(
modifier = Modifier
.fillMaxWidth()
.height(67.dp)
.clickable{
onContinentSelected()
navController.navigate(ScreenView.ContinentsCountriesPage.route)
}
型
按钮确实正确导航到ContinentsCountriesPage
,但视图模型中的“North America”字符串没有被维护,它被视为来自目标组合的空字符串。
@Composable
fun ContinentsCountriesPage(navController: NavHostController){
Log.d("ViewModelTest", "Page Opened")
val viewModel1: ContinentsViewModel = viewModel()
val selectedContinent = viewModel1.selectedContinent.value
Log.d("ViewModel", "Continent selected: $selectedContinent")
Log.d("ViewModelTest", "ContinentsCountries ViewModel: ${viewModel1.hashCode()}")
型
我尝试了控制台记录selectedContinent
的值,该值在DiscoverCountries
代码文件中正确更新,但在ContinentsCountriesPage
文件中为空字符串。我确保了视图在同一个导航主机控制器下。当记录每个文件中视图模型的hashCode时,它们是不同的,我不确定它们是否应该是相同的hashCode。
2条答案
按热度按时间omqzjyyz1#
您可以考虑将字符串作为导航参数传递,如下所述:使用参数导航。
或者,您可以创建一个应用级别
ViewModel
。为此,您可以将ComponentActivity
作为ViewModelStoreOwner
函数传递给viewModel
。要查找父Activity,您可以使用此函数(source):字符串
yeotifhr2#
在ViewModel类中,尝试替换此行:
字符串
对于这一个:
型
这意味着您的变量仅可用于ViewModel外部的
read
,但read & write
可用于ViewModel内部。