如何将ViewModel作为函数参数传入并访问其成员?
问题原因
你遇到的「Unresolved reference: abc」错误核心是类型不匹配:app函数的参数v被声明为父类ViewModel,而abc是子类simpleViewModel独有的成员变量,父类ViewModel中并没有这个属性,所以编译器无法识别。
解决方案
不需要把整个应用写成单一函数,只需调整两处即可解决问题:
修正参数类型
把app函数的参数类型从ViewModel改成你的子类simpleViewModel(建议遵循Kotlin编码规范,类名首字母大写,改为SimpleViewModel),这样就能直接访问abc成员。优化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
相关产品推荐
相关产品推荐

