首页 > 解决方案 > 使用视图模型时不断收到“分类器‘SharedViewModel’没有伴随对象,因此必须在此处初始化”错误

问题描述

我的代码中有两个错误。一个是在私有 val sharedView 模型中,我不断收到“分类器‘SharedViewModel’没有伴随对象,因此必须在此处初始化”。最后,在 question.text = sharedViewmodel.question 和 question.text = sharedViewModel.answer 这两行中,我都收到“类型不匹配。必需:可编辑!找到:字符串?” 但是当我尝试将其更改为可编辑时,我会在我的按钮单击侦听器下方出现错误,以获取 question/answer.text.toString()。有谁知道如何解决这些问题?这是我的代码:

    package com.example.quest

import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.widget.EditText
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.preference.PreferenceManager
import com.google.android.material.floatingactionbutton.FloatingActionButton

class SecondActivity : AppCompatActivity() {
    private val sharedViewModel: SharedViewModel by viewModels(SharedViewModel)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)

        val question = findViewById<EditText>(R.id.question)
        val answer = findViewById<EditText>(R.id.answer)

        if(sharedViewModel.question != null) {
            question.text = sharedViewModel.question
        }

        if(sharedViewModel.answer != null) {
            answer.text = sharedViewModel.answer
        }

        findViewById<FloatingActionButton>(R.id.btn3).setOnClickListener {

            sharedViewModel.question = question.text.toString()
            sharedViewModel.answer = answer.text.toString()
            val questiontext = question.text.toString()
            val answertext = answer.text.toString()

            val returnIntent = Intent()
            returnIntent.putExtra("test", questiontext)
            returnIntent.putExtra("test2", answertext)
            setResult(Activity.RESULT_OK, returnIntent)

            finish()
        }
    }

    }

视图模型:

    package com.example.quest

import androidx.lifecycle.ViewModel

class SharedViewModel : ViewModel() {
    var question: String ?= null
    var answer: String ?= null

}

标签: androidkotlin

解决方案


只需使用by viewModels()而不传递类的名称。当您的 ViewModel 有一个空的构造函数时,您不需要传递任何东西。

而不是question.text = sharedViewModel.question,使用question.setText(sharedViewModel.question). 与另一个相同。问题是在 Java 中定义的 TextView 有多种setText()方法。Kotlin 从参数类型与 的返回值匹配的属性中创建一个属性,该属性getText()返回一个 Editable 而不是 String。所以 TextView 的属性访问语法只适用于 Editables 而不是 Strings。


推荐阅读