Kotlin 中的 ViewModel:未解决的参考

Posted

技术标签:

【中文标题】Kotlin 中的 ViewModel:未解决的参考【英文标题】:ViewModel in Kotlin: Unresolved Reference 【发布时间】:2018-09-30 18:12:44 【问题描述】:

我正在尝试在 100% Kotlin 应用程序中实现 ViewModel。我能找到的每篇文档都说我想用它来获取 ViewModel 实例:

ViewModelProviders.of(this).get(CustomViewModel::class.java)

根据文档,我应该可以通过以下方式导入:

import android.arch.lifecycle.ViewModelProviders

但此导入尚未解决。我在构建文件中使用以下内容:

def androidArchVersion = '1.1.1'
implementation "android.arch.lifecycle:viewmodel:$androidArchVersion"
implementation "android.arch.lifecycle:livedata:$androidArchVersion"
annotationProcessor "android.arch.lifecycler:compiler:$androidArchVersion"
testImplementation "android.arch.core:core-testing:$androidArchVersion"

为什么我无法访问ViewModelProviders

【问题讨论】:

【参考方案1】:

包含以下内容作为依赖项:

implementation "android.arch.lifecycle:extensions:1.1.1"

等效的AndroidX依赖是:

"androidx.lifecycle:lifecycle-extensions:VERSION"

其中 VERSION 可以替换为当前稳定版、Beta 或 Alpha 值给定 in this official link

此依赖项适用于 ViewModel 和 LiveData,因此也不需要您为相同的对象提供单独的依赖项;即您指出的前两个依赖项可以替换为上述生命周期扩展依赖项。

【讨论】:

是的,这就是问题所在! 添加此行后,我仍然遇到同样的问题。最后,我发现我使用的 ViewModelProvider 最后没有“s”。 30分钟试图弄清楚这一点。谢谢! 等效的AndroidX依赖是"androidx.lifecycle:lifecycle-extensions:2.0.0" activityViewModels 呢? 为了所有神圣事物的爱。 ...s 赢得胜利。【参考方案2】:

就我而言,我失踪了:

implementation "androidx.fragment:fragment-ktx:1.1.0"

【讨论】:

谢谢你为我工作,刚刚你在 5 小时前回答了? 我做了所有的建议,除了包含这个依赖项之外没有任何效果【参考方案3】:

除了Sup 的建议之外,您还必须将lifecycler:compiler 更正为lifecycle:compiler - 由于这个错字,Gradle 同步甚至不会成功完成。

其次,标准的 android 注释处理(“annotationProcessor”)并不真正适用于 Kotlin。相反,请使用 Kotlin 的 kapt。

在 build.gradle 文件的顶部,添加以下内容:

apply plugin: 'kotlin-kapt'.

在您的依赖项部分,将出现的annotationProcessor(如上面的)替换为kapt,例如

kapt "android.arch.lifecycle:compiler:1.1.1"

【讨论】:

我认为这个建议会显示出来。我确实对此进行了测试,但将其分开,因为它没有解决未解决的参考问题。感谢您的拒绝,以及错误捕获(由于某种原因确实同步)。【参考方案4】:

ViewModelProviders 在 1.1.0 中已弃用

检查这个 android 文档 https://developer.android.com/topic/libraries/architecture/viewmodel

我正在使用 2.3.1 并在 build.gradle

中添加以下依赖项
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'

在您的 Kotlin 代码中声明 ViewModel,如下所示:

private val cartViewModel: CartViewModel by viewModels()

不过,如果您遇到以下错误,例如

Unresolved reference: viewModels

然后需要在build.gradle

中添加下面的依赖
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'

OR

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

【讨论】:

所有其他答案垃圾邮件都不起作用。真正的解决方案是提供// Main val main_version = "1.4.0" implementation("androidx.activity:activity-ktx:$main_version") implementation("androidx.fragment:fragment-ktx:$main_version")。谢谢。【参考方案5】:

我在 AndroidStudio 3.0.1 中遇到了这种问题,并通过添加解决了 正确 build.gradle 中的以下依赖项:

implementation "android.arch.lifecycle:extensions:1.1.1"
annotationProcessor "android.arch.lifecycle:compiler:1.1.1"

版本代码可能与 AndroidStudio 告诉您的不同。

【讨论】:

【参考方案6】:

如果上述“添加/更新依赖项”未能解决您的问题,请尝试重新启动您的 android studio。这只是为了扎根,我认为它没有任何重大问题。希望对您有所帮助。

【讨论】:

【参考方案7】:

我通过这样做来解决这个问题。 实现这个依赖

implementation "android.arch.lifecycle:extensions:1.1.1"

然后调用我的 ViewModel 类

homeViewModel = ViewModelProvider(this).get(HomeViewModel::class.java)

【讨论】:

【参考方案8】:

为我解决了这种依赖

 implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"

【讨论】:

【参考方案9】:

这也可以通过将 minSdkVersion 设置为 21 来解决。

如果您有minSdkVersion 21 或更高版本,则不需要implementation "android.arch.lifecycle:extensions:1.1.1"

【讨论】:

【参考方案10】:
android 
    kotlinOptions 
        jvmTarget = '1.8'
     

项目和应用级别

【讨论】:

【参考方案11】:

如果有人想要 androidx,那么,首先 - 在 build.gradle (app) 中:

implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"

第二个 - 带代码的文件:

import androidx.lifecycle.ViewModelProvider

第三个 - 使用它:

ViewModelProvider(this).get(CustomViewModel::class.java)

或者像这样使用它(如果需要 ViewModelFactory):

ViewModelProvider(this, CustomViewModelFactory).get(CustomViewModel::class.java)

【讨论】:

以上是关于Kotlin 中的 ViewModel:未解决的参考的主要内容,如果未能解决你的问题,请参考以下文章

使用 Kotlin 从 Android 上 ViewModel 中的 LiveData 更新 ListView 中的元素

ViewModel 中的 Kotlin Dagger 字段注入引发 Dagger/Binding 异常

IntelliJ 中的 Kotlin 未解决的参考

用Kotlin Flow解决Android开发中的痛点问题

用Kotlin Flow解决Android开发中的痛点问题

用Kotlin Flow解决Android开发中的痛点问题