Kami dapat meneruskan parameter ke ViewModel kami, menggunakannya sebagai pemegang data, juga untuk berbagi data antar Fragmen, dan untuk mempertahankan statusnya di seluruh proses rekreasi.
Ini adalah bagian dari seri multi-bagian mengenai Advanced ViewModels di Android. Posting ini berfokus pada bagaimana ViewModel kami dapat dibagikan di antara Fragmen.
Berbagi Model Tampilan dapat berguna dalam skenario berikut:
- Master/Detail flow.
- Main View with a Modal (Dialog, BottomSheet, etc).
Dalam kasus kami, kami memiliki aliran Master/Detail: ShowNewsFragment memungkinkan pengguna untuk mencari berita dan NewsDetailFragment akan menampilkan detail berita yang dipilih. Kami dapat mengarsipkan ini dengan membuat ViewModel bersama dengan Konteks Aktivitas:
private val viewModel: SharedNewsViewModel by activityViewModels { SharedNewsViewModel.Factory(newsService) }
Per dokumentasi, menurut activityViewModels adalah delegasi properti untuk mendapatkan referensi ke ViewModel yang dicakup ke Aktivitasnya. Jadi, ViewModel bersama kami akan bertahan di seluruh rekreasi Fragmen.
Mengingat bahwa ViewModel kami adalah pemegang data, mari buat LiveData yang ingin kami bagikan di antara Fragmen kami:
private val _selectedNews = MutableLiveData<News>()
Dan pengambil dan penyetel yang sesuai untuk berita yang dipilih:
fun setSelectedNews(news: News) {
_selectedNews.value = news
}
fun getSelectedNews() = _selectedNews.value
Kemudian, di NewsDetailFragment kita perlu mengakses ViewModel bersama yang sama:
private val viewModel: SharedNewsViewModel by activityViewModels()
Perhatikan bahwa tidak perlu melewati Pabrik karena di sini kita mendapatkan referensi ViewModel yang sebelumnya dibuat di ShowNewsFragment.
Terakhir, dan juga di NewsDetailFragment, kita perlu mendapatkan dan menampilkan berita yang dipilih:
override fun onViewCreated(view: View, savedInstanceState: Bundle?){
super.onViewCreated(view, savedInstanceState)
viewModel.getSelectedNews()?.let { news ->
with(binding) {
ivNews.loadUrl(news.urlToImage)
tvTitle.text = news.title
tvAuthor.text = news.author}
...
}
}
}
Pernahkah Anda memperhatikan bahwa kami tidak menggunakan Bundel untuk meneruskan data ke Fragmen? Berdasarkan fakta bahwa ViewModel kami adalah pemegang data, kami dapat melupakan TransactionTooLargeException dan batas ukurannya 1 MB ketika kami berurusan dengan Bundel dan meneruskan data antara argumen Aktivitas atau Fragmen karena kami mengakses nilai LiveData sebagai gantinya.
Saat menggunakan ViewModel yang dibagikan, kami tidak mengamati LiveData yang dibagikan dalam tampilan Detail atau Modal, kami hanya mendapatkan nilai dari LiveData yang dibagikan. Pada dasarnya, jika kita mengamati LiveData yang dibagikan dalam tampilan Detail atau Modal, kita akan mendapatkan acara baru segera setelah kita mulai mengamatinya karena LiveData yang dibagikan memiliki nilai yang sudah ada yang diposting di Master atau Tampilan Utama dan ini dapat menyebabkan hal yang tidak diinginkan. hasil jika kita mengamati status (Memuat, Sukses, Kesalahan) dan melakukan operasi berdasarkan status tersebut.