ViewModel 结构在单独的 Jetpack Compose 可组合项中调用时不维护变量值

问题描述 投票:0回答:1

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。

android kotlin mvvm android-jetpack-compose android-viewmodel
1个回答
0
投票

您可以考虑将字符串作为导航参数传递,如下所述:使用参数导航

或者您可以创建一个应用程序级别

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()!!)
© www.soinside.com 2019 - 2024. All rights reserved.