kotlin 使用视图模型时,不断收到“分类器”SharedViewModel“没有伴随对象,因此必须在此处初始化”错误

wpx232ag  于 2023-01-17  发布在  Kotlin
关注(0)|答案(2)|浏览(142)

我在代码中遇到两个错误。一个是在私有瓦尔sharedView模型中,我一直得到“分类器'SharedViewModel'没有伴随对象,因此必须在此处初始化”。最后,在两行question.text = sharedViewmodel.question和question.text = sharedViewModel.answer中,我得到“类型不匹配。要求:可编辑!找到:字符串?”但是当我尝试将其更改为可编辑时,我在按钮click listener for 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

}
ix0qys7i

ix0qys7i1#

只需要使用by viewModels()而不传递类名,当你的ViewModel有一个空的构造函数时,你不需要传递任何东西。
使用question.setText(sharedViewModel.question)代替question.text = sharedViewModel.question。另一个也是一样。问题是在Java中为TextView定义了多个setText()方法。Kotlin创建了一个属性,该属性的参数类型与getText()的返回值匹配,getText()返回Editable而不是String。因此TextView的属性访问语法只适用于Editables而不是String。

wfveoks0

wfveoks02#

SomethingViewModel:class.java通常是一个拼写错误。注意全冒号,并确保它们总是两个,即SomethingViewModel::class.java

相关问题