【问题标题】:How to pass editText value to viewModel and Livedata (Kotlin)如何将 editText 值传递给 viewModel 和 Livedata (Kotlin)
【发布时间】:2018-11-22 06:34:51
【问题描述】:

我正在学习Android + Kotlin,并做一个简单的例子来理解LiveData + ViewModel。这很简单:我有一个根活动和两个片段。 FragmentOne 有两个 EditText。对这些值求和,我需要将结果传递给 ViewModel。然后我在根活动和 FragmentTwo 中都使用观察来查看更改的数据。

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()})

观察者片段二

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),它保存了来自 sum 的 Int 值。观察者也在工作(如果我在 ViewModel 中实例化 result.value,则该值可被活动和片段观察到)

感谢您的帮助。

【问题讨论】:

    标签: android kotlin android-edittext viewmodel


    【解决方案1】:

    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)
    })
    

    【讨论】:

    • 关于字符串的好建议,@karthik。我记得在 viewModel 中阅读了一些关于引用的内容。那就是关于它的一切。再次感谢。
    猜你喜欢
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    相关资源
    最近更新 更多