You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过ViewModel跨Composable修改Int值并在跳转后生效

用ViewModel跨Composable修改并共享整数值

首先修正你提供的ViewModel代码里的变量名错误(_hanging应该是_amt),同时调整为更规范的MVVM写法——外部只暴露只读状态,通过函数修改值:

import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.State
import androidx.lifecycle.ViewModel

class SharedViewModel : ViewModel() {
    // 内部可变状态,仅ViewModel内可修改
    private var _amt = mutableStateOf<Int>(5)
    // 外部只读状态,Composable可观察
    val amt: State<Int> = _amt

    fun changeHangingToFortyFive() {
        _amt.value = 45
    }
}

实现步骤

  • 共享ViewModel实例
    在所有需要访问这个值的Composable中,通过viewModel()函数获取同一个ViewModel实例(默认情况下,同一导航图内的Composable会共享同一个实例,确保数据同步)。

  • 触发值修改的Composable
    比如在首页添加按钮,点击时调用ViewModel的修改函数,再导航到目标页面:

    import androidx.compose.foundation.layout.Column
    import androidx.compose.material3.Button
    import androidx.compose.material3.Text
    import androidx.compose.runtime.Composable
    import androidx.lifecycle.viewmodel.compose.viewModel
    import androidx.navigation.NavHostController
    
    @Composable
    fun HomeScreen(navController: NavHostController, viewModel: SharedViewModel = viewModel()) {
        Column {
            Text(text = "当前值: ${viewModel.amt.value}")
            Button(onClick = {
                // 修改值
                viewModel.changeHangingToFortyFive()
                // 导航至目标页面
                navController.navigate("detail")
            }) {
                Text(text = "改值并跳转")
            }
        }
    }
    
  • 展示更新后值的Composable
    目标页面直接读取ViewModel的amt状态,由于它是State类型,Composable会自动感知值的变化并重组刷新:

    import androidx.compose.foundation.layout.Column
    import androidx.compose.material3.Text
    import androidx.compose.runtime.Composable
    import androidx.lifecycle.viewmodel.compose.viewModel
    
    @Composable
    fun DetailScreen(viewModel: SharedViewModel = viewModel()) {
        Column {
            Text(text = "跳转后的值: ${viewModel.amt.value}")
        }
    }
    
  • 导航配置
    用Navigation Compose搭建导航结构,确保两个页面属于同一导航图,这样ViewModel实例会被共享:

    import androidx.compose.runtime.Composable
    import androidx.navigation.compose.NavHost
    import androidx.navigation.compose.composable
    import androidx.navigation.compose.rememberNavController
    
    @Composable
    fun AppNavigation() {
        val navController = rememberNavController()
        NavHost(navController = navController, startDestination = "home") {
            composable("home") {
                HomeScreen(navController = navController)
            }
            composable("detail") {
                DetailScreen()
            }
        }
    }
    

核心原理

ViewModel的生命周期不受Composable的重组或导航影响,只要是同一实例,修改后的值会一直保留。用mutableStateOf包裹整数,能让Composable自动监听值的变化,导航到目标页面时自然能看到最新值。

内容的提问来源于stack exchange,提问作者Anurenj Sudheer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 16:55:42