你好,我正在尝试使用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
这不会奏效,原因有二:
- 在尝试使用它之前,您没有为它赋值
- 您不能为其赋值,因为视图绑定是活动和片段的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()
代码移动到您的活动中,因为它正在更新小部件。