Наблюдайте экземпляр LiveData во фрагменте и действии - PullRequest
0 голосов
/ 13 марта 2019

У меня есть простой сценарий, когда я делаю что-то фрагментарно, и когда я получаю LiveData, я хочу сделать что-то в Activity.

ViewModel:

class MyViewModel(application: Application) : AndroidViewModel(application) {

    ...

    fun getUser(id: String): LiveData<User> {
        return repository.getUser(id)
    }

}

Фрагмент:

class MyFragment : Fragment() {

private lateinit var myViewModel: MyViewModel

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    activity?.run {
        myViewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
    } ?: throw Exception("Invalid Activity")
}

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    return inflater.inflate(R.layout.fragment, container, false)
}

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    button.setOnClickListener {
        showProgressBar()
        myViewModel.getUser(editText.text.toString()).observe(this, Observer { it ->
            //TODO
        })
    }
}

}

Активность:

class MainActivity : AppCompatActivity() {

private lateinit var myViewModel: MyViewModel

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    myViewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
    //Here I would like to observe the user instance returned from the getUser() method
}}

Итак, проблема в том, что я хотел бы иметь экземпляр LiveData<User> в MyViewModel, чтобы я мог наблюдать это в Деятельности и Фрагменте.Как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Напишите метод в Деятельности doSomethingWithUser(user: User)

И в вашей жизни

myViewModel.getUser(editText.text.toString()).observe(this, Observer { it ->
            (requireActivity() as MainActivity).doSomethingWithUser(it)
        })
0 голосов
/ 13 марта 2019

в классе MyViewModel создать

    val userLiveData =MutableLiveData<User>()

и геттер

    fun getUserLiveData(id: String): MutableLiveData<User> {
            return userLiveData
    }

    fun getUser(id: String){
    val disposableUser = repository.getUser(id)
    .subscribe({
        userLivedata.postValue(it)
    })

}

А в деятельности или Фрагмент называется

   myViewModel.getUserLiveData.observe(this, Observer { it ->
      //TODO
    })
   myViewModel.getUser(...)

А теперь во ViewModel у вас есть объект User (userLiveData.getValue ())

...