Postingan lainnya
Akses livedata setelah navigasi ke fragment lain.
Selamat Sore, Saya mau bertanya disini kenapa saat saya akses data yang disimpan pada ViewModel dengan Livedata di fragment lain kok tidak bisa?
Studi kasus saya begini, saya buat inputan nama dan email di fragment HomeFragment , ketika submit maka akan pindah ke ResultFragment untuk menampilkan data nama dan email yang dimasukan. Masalahnya data di result tidak muncul atau dalam artian saat akses ViewModel tidak mendapat nilai.
HomeFragment
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val binding: FragmentHomeBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_home, container, false)
viewModel = ViewModelProvider(this).get(UserViewModel::class.java)
binding.btnSubmit.setOnClickListener {
viewModel.setUser(binding.nama.text.toString(), binding.email.text.toString())
view!!.findNavController().navigate(HomeFragmentDirections.homeToResult())
}
return binding.root
}
ResultFragment
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_result, container, false)
viewModel = ViewModelProvider(this).get(UserViewModel::class.java)
Log.i("log", "Ini oncreateView")
Log.i("log_nama", viewModel.nama_user.value.toString())
val namaObserver = Observer<String>{
binding.namaUser.text = it
}
viewModel.nama_user.observe(this, namaObserver)
return binding.root
}
dan ini UserViewModel
class UserViewModel: ViewModel(){
var nama_user = MutableLiveData<String>()
var email_user = MutableLiveData<String>()
init {
nama_user.value = ""
email_user.value = ""
}
fun setUser(nama: String , email: String){
nama_user.value = nama
email_user.value = email
}
}
1 Jawaban:
Jawaban Terpilih
Kemungkinan viewModel nya sudah ter destroy saat pergantian fragment.
HomeFragment <pre> viewModel = ViewModelProvider(this).get(UserViewModel::class.java) </pre> dari kode diatas viewModel secara tidak langsung lifecyclenya berdasarkan fragment (HomeFragment). Jadi saat fragment di destroy, viewModel jg ikut terdestroy.
Tujuannya untuk menghindari memory leak.
Sedangkan saat di ResultFragment <pre> viewModel = ViewModelProvider(this).get(UserViewModel::class.java) </pre> viewModel di instance baru dan lifecylenya berdasarkan lifecycle dari ResultFragment. Jadi solusinya kamu bisa buat sharing viewmodel. Dengan cara lifecycle dari viewmodel bukan berdasarkan fragment tapiberdasarkan activity mereka.
Contohnya : <pre> viewModel = ViewModelProvider(this.activity).get(UserViewModel::class.java) </pre> Jadi lifecycle dari viewmodel berdasarkan activity, dalam hal ini activity parent dari masing2 fragment
Tanggapan
Mantaps mas.. terimakasih banyak jawabannya. Sangat jelas penjelasannya heheh