在
DiscoverCountries
可组合页面中,有一个可组合按钮,用于更新 selectedContinent
ViewModel() 类的 ContinentsViewModel
字符串成员的值。我正在尝试在不同文件中的不同可组合函数中使用更新后的字符串,但正在维护默认的空字符串。
单击此特定按钮时,它会传递
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")
}
}
item(){
val pdeCard3 = Card("Some Title", "Some Location", 123)
pdeCard3.ContinentsCard(navController,
"North America",
onContinentSelected = { viewModel1.selectContinent("North America") })
}
以下是函数定义的相关代码片段:
@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。
您可以考虑将字符串作为导航参数传递,如下所述:使用参数导航。
或者您可以创建一个应用程序级别
ViewModel
。为此,您可以将 ComponentActivity
作为 ViewModelStoreOwner
传递给 viewModel
函数。要查找父活动,您可以使用此功能(source):
fun Context.findActivity(): ComponentActivity? = when (this) {
is ComponentActivity -> this
is ContextWrapper -> baseContext.findActivity()
else -> null
}
val appViewModel: AppViewModel = viewModel(LocalContext.current.findActivity()!!)