当前开始学习 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确实很有帮助,这就是为什么我要继续使用此应用程序以使其正常工作。
答案 0 :(得分:0)
更新
嘿,我发现您没有包含该库
implementation 'androidx.core:core-ktx:1.0.2'
您是否尝试编写如下代码
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
。第一个字符必须是小写的,它会起作用。