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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 19:57:25