如何将editText值传递给viewModel和Livedata(Kotlin)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将editText值传递给viewModel和Livedata(Kotlin)相关的知识,希望对你有一定的参考价值。

我正在研究android + Kotlin并做一个简单的例子来展示LiveData + ViewModel。这很简单:我有一个根活动和两个片段。 FragmentOne有两个editText。这些值相加,我需要将结果传递给ViewModel。然后,我在根活动和FragmentTwo中使用observe来查看更改的数据。

FragmentOne

class FragmentOne: Fragment() {
   private val model by lazy { ViewModelProviders.of(activity).get(MyViewModel::class.java) }
   var resultSum:Int = 0

   override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
     val view = inflater?.inflate(R.layout.fragment_one,container,false)
     val btn = view?.findViewById<Button>(R.id.sendToModel)
     btn?.setOnClickListener({
         val field1 = n1.text.toString().toInt()
         val field2 = n2.text.toString().toInt()
         resultSum = field1 + field2
         model.update()
     })
     return view
  }
}

视图模型

class MyViewModel: ViewModel() {
   private val fragment by lazy {FragmentOne()}
   private var _result = MutableLiveData<Int>().apply { value = 0 }
   val result: LiveData<Int>
      get() = _result

   fun update(){
       _result.value = fragment.resultSum
   }
}

观察者根活动

private val resultModel by lazy {ViewModelProviders.of(this).get(MyViewModel::class.java)}
resultModel.result.observe(this, Observer { result -> resultTxt.text = result.toString()})

Observer FragmentTwo

private val resultModel by lazy {ViewModelProviders.of(activity).get(MyViewModel::class.java)}
resultModel.result.observe(this, Observer { result -> resultTxt.text = result.toString()})

我检查了var resultSum(Log)并且它保存了总和的Int值。观察者也在工作(如果我在ViewModel中实例化result.value,则值可观察到活动和片段)

我感谢任何帮助。

答案

ViewModel不应该对Android。*库有任何引用。因此,您对FragmentOne的引用是一种不好的做法。

更简洁的方法是更改​​update()函数以接受字符串 -

 fun update(result: String){
        _result.value = result
    }

并更改您的FragmentOne代码说 -

btn?.setOnClickListener({
    val field1 = n1.text.toString().toInt()
    val field2 = n2.text.toString().toInt()
    resultSum = field1 + field2
    model.update(resultSum)
})

以上是关于如何将editText值传递给viewModel和Livedata(Kotlin)的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 将@Published viewmodel 对象值传递给@Binding

如何将 UI Dispatcher 传递给 ViewModel

将edittext值传递给另一个获取空值的活动

可以将 ViewModel 传递给 RecyclerView(无 DataBinding)吗?

[Catel]如何将带有构造函数参数的 ViewModel 传递给 TabService 扩展方法?

MVVM 并将可选值传递给 viewModel