Android Studio中CounterViewModel相关Unresolved Reference问题求助
解决Compose中
viewModel()函数的Unresolved Reference错误 针对你代码中第25行import androidx.lifecycle.viewmodel.compose.viewModel和第27行val viewModel: CounterViewModel = viewModel()的未解析引用错误,按以下步骤排查修复:
1. 补充ViewModel Compose依赖
viewModel()是Jetpack为Compose提供的扩展函数,必须在模块级build.gradle(或build.gradle.kts)中引入对应依赖:
Groovy语法(build.gradle):
dependencies { // 替换为当前最新版本号,比如2.6.2 implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2" // 同时确保基础ViewModel依赖存在 implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2" }
Kotlin DSL语法(build.gradle.kts):
dependencies { implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2") implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2") }
添加后点击Android Studio顶部的「Sync Project with Gradle Files」同步依赖。
2. 实现CounterViewModel类
你的代码中调用了CounterViewModel但未提供该类定义,这是核心错误点之一。创建并实现该类,示例代码如下:
import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch class CounterViewModel : ViewModel() { private val _count = MutableStateFlow(0) val count: StateFlow<Int> = _count fun increment() { viewModelScope.launch { _count.value += 1 } } fun decrement() { viewModelScope.launch { _count.value -= 1 } } }
将该类放在molotov.king.countermvvm包下,或在MainActivity中添加导入语句:
import molotov.king.countermvvm.CounterViewModel
3. 清理缓存重启IDE
如果上述步骤完成后仍报错,执行以下操作:
- 点击菜单栏「File」→「Invalidate Caches...」
- 勾选「Invalidate and Restart」,等待IDE重启并重新构建项目
修复后的完整代码示例
package molotov.king.countermvvm import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height import androidx.compose.material3.Button import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.ViewModel import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch import molotov.king.countermvvm.ui.theme.CounterMVVMTheme class CounterViewModel : ViewModel() { private val _count = MutableStateFlow(0) val count: StateFlow<Int> = _count fun increment() { viewModelScope.launch { _count.value += 1 } } fun decrement() { viewModelScope.launch { _count.value -= 1 } } } class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { val viewModel: CounterViewModel = viewModel() CounterMVVMTheme { Surface( modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ) { TheCounterApp(viewModel) } } } } } @Composable fun TheCounterApp(viewModel: CounterViewModel){ Column(modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ){ Text(text= "Count: ${viewModel.count.value}", fontSize = 24.sp, fontWeight = FontWeight.Bold ) Spacer(modifier = Modifier.height(16.dp)) Row { Button(onClick = {viewModel.increment()} ){ Text("Increment") } Button(onClick = {viewModel.decrement()} ){ Text("Decrement") } } } } @Preview(showBackground = true) @Composable fun GreetingPreview() { CounterMVVMTheme { TheCounterApp(viewModel()) } }
内容的提问来源于stack exchange,提问作者corpse_xc
相关产品推荐
相关产品推荐

