'by viewModels()' Kotlin 属性委托未解决的引用

73

我正在尝试使用Kotlin实现ViewModel。首先,我添加了所需的依赖项:

implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.core:core-ktx:1.2.0'
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"
// Annotation processor
kapt "androidx.lifecycle:lifecycle-compiler:2.2.0"

然后我创建了一个简单的视图模型:

class MyViewModel: ViewModel() {
    val greeting = "Hello World"
}

但是当我尝试使用Kotlin属性委托从活动中访问ViewModel时:

val model by viewModels<MyViewModel>()
编译器未解析viewModels。我不知道问题出在哪里。我有遗漏什么吗?
8个回答

124

13
据我所知,Fragment Ktx 应该已经足够了。 - Pawel

17

对我来说,上述的解决方案没有起作用。

我需要导入:

implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5'

1
我现在已经解决了我的最大问题。 - Prasanna Kumar

6
在模块级别的build.gradle中使用以下依赖项来解决此错误。
implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5'
implementation 'androidx.navigation:navigation-ui-ktx:2.3.5'

或者

implementation 'androidx.lifecycle:lifecycle-extensions-ktx:2.2.0'
implementation 'androidx.activity:activity-ktx:1.4.0'
implementation 'androidx.fragment:fragment-ktx:1.3.6'

我还添加了以下依赖项,以实现在Kotlin中使用ViewModel

implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.1'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1'

我的模块级别的 build.gradle 文件如下所示:

plugins {
    id 'com.android.application'
    id 'kotlin-android'
}

4
这取决于您如何使用ViewModel。如果您不使用片段,则足以解决活动中的“未解决的引用:viewModels”问题。
// ViewModel
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'
implementation 'androidx.activity:activity-ktx:1.6.1' 

// is to add the dependency on Fragment
implementation 'androidx.fragment:fragment-ktx:1.2.5'

// is to add the dependency on Activity
implementation 'androidx.activity:activity-ktx:1.1.0' 

3

对于我来说,以上解决方案无效。

添加此依赖项:

implementation 'androidx.navigation:navigation-ui-ktx:2.3.5'

请添加以下依赖项:
 implementation "androidx.lifecycle:lifecycleviewmodel:2.2.0"

1

对我来说,我有以下依赖项:

implementation 'androidx.activity:activity-compose:1.5.0'

但我仍然面临着相同的错误。

原因是必须在 onCreate() 中调用 by viewModels():

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val customViewModel: MyViewModel by viewModels()

        setContent {
            AppTheme {
                Surface() {
                    MyApp(customViewModel = customViewModel)
                }
            }
        }
    }
}

该函数只能在其它可组合函数内部调用,但我试图从MyApp()可组合函数中调用它,因此出现错误。


0
在我的情况下,我只是使用了错误的 Activity 类型。我使用了 android.app.Activity 而不是 androidx.appcompat.app.AppCompatActivity。而 viewModels() 只能在后者中使用。

0

看看你是否添加了navigation-fragment依赖项。

implementation("androidx.navigation:navigation-fragment-ktx:2.7.0")
implementation("androidx.navigation:navigation-ui-ktx:2.7.0")

同时拥有activity/fragment-ktx会导致viewModels委托对我不可用,所以我将它们全部删除,只保留了导航工件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接