【问题标题】:Can't access class 'viewModel'. Check your module classpath for missing or conflicting dependencies无法访问类“viewModel”。检查您的模块类路径是否存在缺失或冲突的依赖项
【发布时间】:2023-03-25 00:30:01
【问题描述】:

目前开始学习MVVM Kotlin。这个 youtube 教程非常令人困惑,但直截了当。

https://www.youtube.com/watch?v=0LaUXQcGuT0&t=254s

我的标题中有这个错误。

这段代码触发了我的MainActivity中的错误

这是我的Module:app (build.gradle)

依赖关系

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

//Config data binding compiler with Kotlin
kapt 'com.android.databinding:compiler:3.1.1'

//LifeCycle Extensions
implementation 'android.arch.lifecycle:extensions:1.1.1'

//Toasty to show Toast
implementation 'com.github.GrenderG:Toasty:1.2.8'
}

数据绑定

dataBinding{
    enabled=true
}

应用插件

  apply plugin: 'com.android.application'

  apply plugin: 'kotlin-android'

  apply plugin: 'kotlin-android-extensions'

  apply plugin: "org.jetbrains.kotlin.kapt"

  apply plugin: 'kotlin-kapt'

我的activity_main.xml

<data>
    <variable
            name="viewModel"
            type="com.example.rnd.kotlinmvvmlogin.ViewModel.LoginViewModel"/>
</data>

这是我的 MVVM 文件结构

MainActivity.kt

package com.example.rnd.kotlinmvvmlogin.View

import android.arch.lifecycle.ViewModelProviders
import android.databinding.DataBindingUtil
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import com.example.rnd.kotlinmvvmlogin.Interface.LoginResultCallbacks
import com.example.rnd.kotlinmvvmlogin.R
import com.example.rnd.kotlinmvvmlogin.ViewModel.LoginViewModel 
import com.example.rnd.kotlinmvvmlogin.ViewModel.LoginViewModelFactory
import com.example.rnd.kotlinmvvmlogin.databinding.ActivityMainBinding
import es.dmoral.toasty.Toasty

class MainActivity : AppCompatActivity(), LoginResultCallbacks {
override fun onSuccess(message: String) {
    Toasty.success(this, message, Toast.LENGTH_SHORT)
        .show()
}

override fun onError(message: String) {
    Toasty.error(this, message, Toast.LENGTH_SHORT)
        .show()
}

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

    val activityMainBinding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
    activityMainBinding.viewModel = ViewModelProviders.of(this, LoginViewModelFactory(this))
        .get(LoginViewModel::class.java)
}
 }

我了解 MVVM 的过程,但我不知道这个错误不断发生的原因是什么。这个 MVVM 的教程对于理解 mvvm kotlin 非常有帮助,这就是我追求继续这个应用程序以使其工作的原因。

【问题讨论】:

  • 请向我们展示您的 mainActivity sn-p 代码
  • 我更新了我的问题,请查看我的 MainActivity.kt

标签: android-studio kotlin mvvm


【解决方案1】:

我有同样的问题。问题在于您的类型type="com.example.rnd.kotlinmvvmlogin.ViewModel.LoginViewModel" 请记住,在数据绑定中,只有 Viewmodel 类名应以大写字母开头,类的其他父文件夹应以小写字母开头。只需将 ViewModel 重命名为 viewModel。清除并重建项目。

【讨论】:

  • 包名小写开头
  • 没错,所有的包名或者你可以说文件夹应该以小写开头。
  • 在我的情况下,我的包名是小写字母,但仍然显示问题
【解决方案2】:

许多遇到这种情况的人都将他们的包命名以大写字母开头。重命名您的包名称以小写字母开头,这样在您对视图模型类的引用路径中,它只有以大写字母开头的视图模型类

type="com.example.rnd.kotlinmvvmlogin.viewModel.LoginViewModel"

解决你的问题

【讨论】:

    【解决方案3】:

    只需将包从 ViewModel 重命名为 viewModel。第一个字符只需小写即可。

    【讨论】:

      【解决方案4】:

      更新

      嘿,我看到你没有包含这个库

      implementation 'androidx.core:core-ktx:1.0.2'
      

      我的依赖

      你有没有尝试编写如下代码

      activityMainBinding?.viewModel = ViewModelProviders.of(this,LoginViewFactory(this)).get(LoginViewModel::class.java)
      

      因为它需要可以为空的变量,但是你分配了不可为空的变量

      【讨论】:

      • 试过了,但对我不起作用。我的 kotlin 版本和 android studio 重要吗?这就是我收到此错误的原因?
      • Kotlin 1.3.31 是稳定版。你有更新吗?
      • 我将我的 android studio 更新到更新版本,我正在使用ext.kotlin_version = '1.3.31' ext.gradle_version = '3.0.1'
      • 你是否包含了这个库实现'androidx.core:core-ktx:1.0.2'
      • 我还建议您将所有依赖项迁移到 jetpack (androidx)。因为在我的项目中,我没有弄错相同的依赖项(jetpack)
      【解决方案5】:

      问题在于您用于视图模型类的包名称 虽然google把这种结构设计模式称为“MVVM”,大家都想在自己的项目中制作“Model”、“ViewModel”和“View”包,但是当数据绑定库要为你生成文件时,就会遇到包名的问题. 所以你只需要更改目标名称:

      import com.example.rnd.kotlinmvvmlogin.ViewModel.LoginViewModel 
      

      到:

      import com.example.rnd.kotlinmvvmlogin.data.LoginViewModel 
      

      或其他任何东西。 此外,您可能希望将“视图”更改为“ui”,以免以后出现问题。

      【讨论】:

        【解决方案6】:

        是的,这很不幸,即使它被称为 MVVM 架构,你也不能有一个名为“ViewModel”、“ViewModels”、“viewModels”的包,或者在任何情况下都类似于排序,否则它只是无法构建,并且会给您带来完全误导性的错误。

        【讨论】:

        • 您可以使用“viewModels”作为包名。只有包名的第一个字母必须是小写才能使用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-22
        • 2019-07-01
        • 1970-01-01
        • 2023-01-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多