Kotlin无法启动模拟器-ViewModel问题



你好,我正在尝试使用ViewModel运行BMI计算器,但尚未成功运行。我是kotlin和android工作室编码的新手。任何帮助都将不胜感激。我希望这只是一个小虫子。我认为问题在于ViewModel代码,但我不确定。就像我的日志一样由:kotlin引起。UninitializedPropertyAccessException:lateinit属性绑定尚未初始化

ViewModel代码:


import android.util.Log
import androidx.lifecycle.ViewModel
lateinit var binding: ActivityMainBinding
private const val TAG = "inc, wt, ft"
class bmiViewModel() : ViewModel() {
val inc =(binding.inch.text.toString()).toInt()
val wt =(binding.lbs.text.toString()).toInt()
val ft =(binding.feet.text.toString()).toInt()
val total = formula(inc,ft,wt)
private fun formula(inc: Int, ft: Int, wt: Int): Float {
val htTotal = (ft.toFloat() / 12) + inc.toFloat()
val BMI  = (wt.toFloat()*703) / (htTotal * htTotal)
Log.d(TAG,"BMI", Exception())
return BMI
}
fun updatebmi(): Unit{
if (total < 18.5) {
binding.status.text = "Under Weight"
} else if (total >= 18.5 && total < 24.9) {
binding.status.text = "Healthy"
} else if (total >= 24.9 && total < 30) {
binding.status.text = "Overweight"
} else if (total >= 30){
binding.status.text = "Obese"
}
}
}

主要活动:

private const val TAG = "MainActivity"
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private val bmiViewModel: bmiViewModel by viewModels()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d(TAG, "OnCreate(Bundle?) called")
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
Log.d(TAG, "Got a BMIViewModel: $bmiViewModel")
binding.calc.setOnClickListener {
if(binding.height.text.isNotEmpty() && binding.weight.text.isNotEmpty()){
bmiViewModel.updatebmi()
binding.bmiTV.visibility = View.VISIBLE
binding.status.visibility = View.VISIBLE
}
else {
Toast.makeText(this,
"Please add a Height & Weight", Toast.LENGTH_SHORT).show()
}
}
binding.clear.setOnClickListener {
reset()
}
}
override fun onStart() {
super.onStart()
Log.d(TAG, "onStart() called")
}
override fun onResume() {
super.onResume()
Log.d(TAG, "onResume() called")
}
override fun onPause() {
super.onPause()
Log.d(TAG, "onPause() called")
}
override fun onStop() {
super.onStop()
Log.d(TAG, "onStop() called")
}
override fun onDestroy() {
super.onDestroy()
Log.d(TAG, "onDestroy() called")
}
private fun reset() {
binding.inch.text.clear()
binding.feet.text.clear()
binding.lbs.text.clear()
binding.status.text = " "
binding.bmiTV.visibility = View.GONE
}
}

bmiViewModel中,您有:

lateinit var binding: ActivityMainBinding

这不会奏效,原因有二:

  1. 在尝试使用它之前,您没有为它赋值
  2. 您不能为其赋值,因为视图绑定是活动和片段的UI,而不是视图模型

将其重写为:

import android.util.Log
import androidx.lifecycle.ViewModel
private const val TAG = "inc, wt, ft"
class bmiViewModel() : ViewModel() {
private fun formula(inc: Int, ft: Int, wt: Int): Float {
val htTotal = (ft.toFloat() / 12) + inc.toFloat()
val BMI  = (wt.toFloat()*703) / (htTotal * htTotal)
Log.d(TAG,"BMI", Exception())
return BMI
}
}

updatebmi()代码移动到您的活动中,因为它正在更新小部件。

最新更新