Как передать значение editText в viewModel и Livedata (Kotlin) - PullRequest
0 голосов
/ 12 июня 2018

Я изучаю 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
  }
}

viewModel

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 (Журнал) и Itудерживать значение Int из суммы.Наблюдатель тоже работает (если я создаю экземпляр result.value внутри ViewModel, это значение заметно для активности и фрагмента)

Я ценю любую помощь.

1 Ответ

0 голосов
/ 12 июня 2018

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)
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...