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 中的元素