Android Studio 中带有 viewModel 的 UninitializedPropertyAccessException

0 android viewmodel kotlin android-studio android-room

我是 Kotlin 和 Android Studio 的新手,现在尝试使用 ViewModel 实现 Room 数据库,但我面临问题“kotlin.UninitializedPropertyAccessException:lateinit 属性habitViewModel 尚未初始化”

我认为这是由于视图模型的早期初始化造成的,但我找不到修复它的方法。

这是我下面的代码。

创建代码时的活动

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

        
    }

Run Code Online (Sandbox Code Playgroud)

视图模型代码


class HabitViewModel: ViewModel() {
    val habitList: LiveData<MutableList<HabitDTO>>
    private var habitRepository: HabitRepo = HabitRepo.get()


    init {
        habitList = habitRepository.list()
    }
}
Run Code Online (Sandbox Code Playgroud)

Build.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")
Run Code Online (Sandbox Code Playgroud)

这是我的错误消息捕获 错误消息

Tyl*_*r V 5

您的问题是这一行,您尝试使用正在初始化的对象的实例

habitViewModel = ViewModelProvider(this)[habitViewModel::class.java]
Run Code Online (Sandbox Code Playgroud)

参数应该是类名,而不是实例名

habitViewModel = ViewModelProvider(this)[HabitViewModel::class.java]
Run Code Online (Sandbox Code Playgroud)

如果您有正确的 -ktx gradle 依赖项,您还可以使用此语法而不是lateinit var在 Kotlin 中获取 ViewModel 的方法 ( implementation 'androidx.activity:activity-ktx:1.5.0')

private val habitViewModel: HabitViewModel by viewModels()
Run Code Online (Sandbox Code Playgroud)