Share data between fragments use ViewModel

Điều rất phổ biến là hai hoặc nhiều fragment trong một activity cần giao tiếp với nhau. Hãy tưởng tượng một trường hợp phổ biến bạn có nhiều fragment chồng lên nhau và chúng có nhu cầu cần giao tiếp.

Thông thường chúng ta thường triển khai theo cách callback fragment – activity, và fragment – fragment thường khá phức tạp.
Tuy nhiên với ViewModel việc giao tiếp dữ liệu với nhau trở nên vô cùng đơn giản.
Công việc chỉ cần Observe sự thay đổi của LiveData trên các fragment mà chúng ta muốn thay cho việc sử dụng callback rườm rà.

Dưới đây mình đi qua 2 bước đơn giản như sau:

Bước 1: Tạo ShareViewModel.kt


class ShareViewModel : ViewModel(){
    val onValueReceive = MutableLiveData ()

    fun setUpdateValue(value :String){
        onValueReceive.value = value
    }

    fun getValueReceive(): LiveData  {
        return onValueReceive
    }
}

ViewModel này sẽ cho phép chúng ta theo dõi, cập nhật dữ liệu mới vào LiveData.

Bước 2: Khởi tạo ViewModel và observe LiveData.

2.1 FragmentMain.kt
Khởi tạo ViewModel và lắng nghe thay đổi của LiveData -> Ghi Log.


private lateinit var viewModel: ShareViewModel
//1. Setup ViewModel
        viewModel = activity?.run {
           ViewModelProviders.of(this).get(ShareViewModel::class.java)
        } ?: throw Exception("Invalid Activity")
//2. Observe live data
        viewModel.onValueReceive.observe(this, Observer  {
            Log.d("onValueReceive1",it)
        })

2.2 FragmentDetail.kt
Khai báo ViewModel, và thay đổi dữ liệu của LiveData.


private lateinit var viewModel: ShareViewModel

viewModel = activity?.run {
           ViewModelProviders.of(this).get(ShareViewModel::class.java)
        } ?: throw Exception("Invalid Activity")
//Update Live Data
viewModel.setUpdateValue("Data Change!!!!")

Như code mô tả ở trên:
– FragmentMain sẽ khởi tạo ViewModel và lắng nghe sự thay đổi của LiveData..
– FragmentDetail sẽ thay đổi dữ liệu của LiveData.
– FragmentMain ghi nhận được sự thay đổi và ghi log.

Về cơ bản triển khai ViewModel thay cho CallBack khá đơn giản và nhanh chóng.
Mong rằng qua bài viết chúng ta có thể tận dụng những cập nhật mới của android vào các project sau này.

Link github tham khảo.

Nguyễn Linh

Chia sẻ để cùng tiến bộ...