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
    }

}

avatar ghonijee
@ghonijee

41 Kontribusi 25 Poin

Diperbarui 4 tahun yang lalu

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

avatar IfanZalukhu
@IfanZalukhu

217 Kontribusi 158 Poin

Dipost 4 tahun yang lalu

Tanggapan

Mantaps mas.. terimakasih banyak jawabannya. Sangat jelas penjelasannya heheh

Login untuk ikut Jawaban