我是Kotlin和Android Studio的新手,现在试图用ViewModel实现Room数据库,但我面临的问题" Kotlin。UninitializedPropertyAccessException: lateinit属性habitViewModel未被初始化">
我认为这是由于视图模型的早期初始化,但我找不到解决它的方法。
下面是我的代码
Activity OnCreate Code
class HabitActivity : AppCompatActivity() {
lateinit var binding : ActivityHabitBinding
lateinit var habitViewModel : HabitViewModel
lateinit var habitAdapter: HabitAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityHabitBinding.inflate(layoutInflater)
habitViewModel = ViewModelProvider(this)[habitViewModel::class.java]
setContentView(binding.root)
// view model
habitViewModel.habitList.observe(this) {
habitAdapter.update(it)
}
// adapter
habitAdapter = HabitAdapter(this)
binding.rvHabitList.layoutManager = LinearLayoutManager(this)
binding.rvHabitList.adapter = habitAdapter
}
<<p>ViewModel代码/strong>
class HabitViewModel: ViewModel() {
val habitList: LiveData<MutableList<HabitDTO>>
private var habitRepository: HabitRepo = HabitRepo.get()
init {
habitList = habitRepository.list()
}
}
构建。Gradle依赖性
def arch_version = "2.1.0"
def lifecycle_version = "2.5.0-rc02"
def roomVersion = "2.4.2"
// Room
implementation("androidx.room:room-runtime:$roomVersion")
kapt("androidx.room:room-compiler:$roomVersion")
implementation("androidx.room:room-ktx:$roomVersion")
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9'
kapt 'org.xerial:sqlite-jdbc:3.34.0'
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version")
捕获,这是我的错误消息错误味精
您的问题是这一行,您试图使用您正在初始化的对象的实例
habitViewModel = ViewModelProvider(this)[habitViewModel::class.java]
参数应该是类名,而不是实例名
habitViewModel = ViewModelProvider(this)[HabitViewModel::class.java]
如果你有正确的-ktx gradle依赖项(implementation 'androidx.activity:activity-ktx:1.5.0'
)
lateinit var
方法来获得Kotlin中的ViewModelprivate val habitViewModel: HabitViewModel by viewModels()