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

如何将ViewModel作为函数参数传入并访问其成员?

问题原因

你遇到的「Unresolved reference: abc」错误核心是类型不匹配:app函数的参数v被声明为父类ViewModel,而abc是子类simpleViewModel独有的成员变量,父类ViewModel中并没有这个属性,所以编译器无法识别。

解决方案

不需要把整个应用写成单一函数,只需调整两处即可解决问题:

  1. 修正参数类型
    把app函数的参数类型从ViewModel改成你的子类simpleViewModel(建议遵循Kotlin编码规范,类名首字母大写,改为SimpleViewModel),这样就能直接访问abc成员。

  2. 优化ViewModel获取方式
    在Composable函数中直接用viewModels()获取ViewModel更符合Jetpack Compose的生命周期管理,不需要从Activity手动传递实例。

修正后的完整代码

// 遵循编码规范,类名首字母大写
class SimpleViewModel : ViewModel() {
    val abc = 1
}

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MyApplicationTheme {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    // 直接调用Composable函数,无需手动传ViewModel
                    App()
                }
            }
        }
    }
}

@Composable
fun App() {
    // 在Composable内获取ViewModel实例
    val viewModel by viewModels<SimpleViewModel>()
    // Text需接收String类型,将Int转为String
    Text(text = viewModel.abc.toString())
}

特殊场景处理

如果确实需要从外部传递ViewModel实例(比如共享实例),可以指定正确的子类类型,或在Composable内安全转型:

// 明确传递子类类型(推荐)
@Composable
fun App(v: SimpleViewModel) {
    Text(v.abc.toString())
}

// 安全转型方式(不推荐,尽量用明确类型)
@Composable
fun App(v: ViewModel) {
    val viewModel = v as? SimpleViewModel ?: return
    Text(viewModel.abc.toString())
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 15:39:57