【问题标题】:ViewModel in Kotlin: Unresolved ReferenceKotlin 中的 ViewModel:未解决的参考
【发布时间】: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

【问题讨论】:

    标签: android gradle kotlin viewmodel android-architecture-components


    【解决方案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)
                

                【讨论】:

                  猜你喜欢
                  • 2018-10-25
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-11-02
                  • 2021-10-29
                  • 2018-10-16
                  • 2023-03-25
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多