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

j1dl9f46  于 11个月前  发布在  Android
关注(0)|答案(2)|浏览(147)

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。

omqzjyyz

omqzjyyz1#

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

fun Context.findActivity(): ComponentActivity? = when (this) {
    is ComponentActivity -> this
    is ContextWrapper -> baseContext.findActivity()
    else -> null
}

val appViewModel: AppViewModel = viewModel(LocalContext.current.findActivity()!!)

字符串

yeotifhr

yeotifhr2#

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

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

字符串
对于这一个:

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


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

相关问题