kotlin 无法访问类'viewModel',请检查模块类路径是否缺少依赖项或存在冲突

tvz2xvvm  于 2023-01-09  发布在  Kotlin
关注(0)|答案(6)|浏览(198)

目前开始学习MVVMKotlin。这个YouTube教程相当混乱,但开门见山。
https://www.youtube.com/watch?v=0LaUXQcGuT0&t=254s
我的标题有这个错误。
此代码触发我的MainActivity中的错误

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

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的教程是真正有助于理解mvvmKotlin这就是为什么我追求继续这个应用程序,使它的工作。

qvk1mo1f

qvk1mo1f1#

我有同样的问题。问题是在你的类型type="com.example.rnd.kotlinmvvmlogin.ViewModel.LoginViewModel"记住在数据绑定只Viewmodel类名应该以大写字母开始和其他父文件夹的一个类应该以小写字母开始。只要重命名ViewModelviewModel。清除和重建项目。

7z5jn7bk

7z5jn7bk2#

很多人都会遇到这种情况,因为他们的包名称都是以大写字母开头的。重命名包名称,使其以小写字母开头,这样在视图Model类的引用路径中,只有视图Model类以大写字母开头
type="com.example.rnd.kotlinmvvmlogin.viewModel.LoginViewModel"
解决你的问题

jq6vz3qz

jq6vz3qz3#

只需将软件包从ViewModel重命名为viewModel,第一个字符必须是小写,这样就可以了。

cu6pst1q

cu6pst1q4#

    • 更新**

嘿,我看到你没有包括这个图书馆

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

我的依赖项

你试过写下面这样的代码吗

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

因为它需要一个可以为空的变量,但是你给它赋值了一个非空的变量

m3eecexj

m3eecexj5#

问题是你的视图模型类使用的包名虽然谷歌称这种结构化设计模式为"MVVM",每个人都想在他们的项目中制作"Model","ViewModel"和"View"包,但当数据绑定库想为你生成文件时,会遇到包名的问题,所以你只需要更改目的地名称:

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

致:

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

或者其他任何东西。你也可以把"视图"改成"用户界面",这样以后就不会有问题了。

fgw7neuy

fgw7neuy6#

是的,这是非常不幸的,即使它被称为MVVM架构,你不能有一个包命名为“ViewModel”,“ViewModels”,“viewModels”,或在任何情况下类似的排序,否则它只是不会建立,它给你一个完全误导性的错误.

相关问题