无法访问类“ viewModel”。检查您的模块类路径是否缺少或冲突的依赖项

时间:2019-07-18 07:07:30

标签: android-studio kotlin mvvm

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

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

我的标题中有此错误。

此代码触发我的MainActivity

中的错误

enter image description here

这是我的Module:appbuild.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的文件结构

enter image description here

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确实很有帮助,这就是为什么我要继续使用此应用程序以使其正常工作。

6 个答案:

答案 0 :(得分:0)

更新

嘿,我发现您没有包含该库

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

我的依赖 enter image description here

您是否尝试编写如下代码

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

许多遇到这种情况的人都以大写字母开头的包裹名称。重命名包名,以小写字母开头,这样,在查看模型类的引用路径中,它只能是以大写字母开头的视图模型类

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

解决您的问题

答案 3 :(得分:0)

问题是您用于视图模型类的包名称 尽管google将此结构设计模式称为“ MVVM”,并且每个人都希望在其项目中制作“ Model”,“ ViewModel”和“ View”包,但是当数据绑定库想要为您生成文件时,包名将面临问题。 因此,您只需要更改目标名称:

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

至:

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

或其他任何内容。 另外,您可能希望将“视图”更改为“ ui”,这样以后就不会出现问题。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

只需将包从 ViewModel 重命名为 viewModel。第一个字符必须是小写的,它会起作用。