Android ViewModel Observer在方向更改之前无法工作(ViewModel可以工作,但更改为Live



我一直在尝试制作一个应用程序,将我的值增加一倍或三倍,变成两个文本视图,当我使用viewModel时,它经受住了所有配置更改。当我将结果类型更改为MutableLiveData时,textView值不会更改,直到我按下按钮后旋转手机。这是我的MainFragment

class MainFragment : Fragment() {
private var _binding: MainFragmentBinding? = null
private val binding get() = _binding!!
companion object {
fun newInstance() = MainFragment()
}
private lateinit var viewModel: MainViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = MainFragmentBinding.inflate(inflater, container, false)
return binding.root
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = ViewModelProvider(this)[MainViewModel::class.java]
binding.textView.text = viewModel.getResults().toString()
binding.textView2.text = viewModel.getResults().toString()

val resultsObserver = Observer<List<Float?>>{
binding.textView.text = it[0].toString()
binding.textView2.text = it[1].toString()
}
viewModel.getResults().observe(viewLifecycleOwner, resultsObserver)
binding.action.setOnClickListener {
if(binding.editTextNumberDecimal.text.isNotEmpty()){
viewModel.setValues(binding.editTextNumberDecimal.text.toString())
}else{
binding.textView.text = getString(R.string.no)
binding.textView2.text = getString(R.string.no1)
}
}
}

}

这是我的视图型号

class MainViewModel : ViewModel() {
private var input = ""
private var doubleValue = 0f
private var tripleValue = 0f
fun setValues(value: String){
input = value
doubleValue = input.toFloat() * 2
tripleValue = input.toFloat() * 3
}
fun getResults(): MutableLiveData<List<Float?>> = MutableLiveData(listOf(doubleValue, tripleValue))

}

MutableLiveData不会自动对您通过setValues设置的更改值作出反应。您需要通过setValue()显式更新MutableLiveData内部的值。

为了实现这一点,我建议您将MutableLiveData存储在ViewModel的字段中,以便能够访问它

例如:

class MainViewModel : ViewModel() {
private var input = ""
private var doubleValue = 0f
private var tripleValue = 0f
private val results = MutableLiveData(listOf(doubleValue, tripleValue))
fun setValues(value: String){
input = value
doubleValue = input.toFloat() * 2
tripleValue = input.toFloat() * 3
// This updates the value inside your LiveData
results.value = listOf(doubleValue, tripleValue)
}
fun getResults(): LiveData<List<Float?>> = results
}

最新更新