Cách liên lạc giữa các đoạn và hoạt động bằng ViewModel

Truyền thông là một trong những chủ đề quan trọng nhất đối với các nhà phát triển và có thể được thực hiện theo nhiều cách. Nhưng thách thức là làm điều đó theo cách dễ dàng và tối ưu nhất. Chúng ta có thể làm điều đó bằng cách sử dụng tệp tĩnh nhưng nó sẽ xảy ra vấn đề bộ nhớ. Để tránh vấn đề bộ nhớ, nhiều nhà phát triển làm một cái gì đó như

(hoạt động như MainActivity) .passDataToAntherFragment ()

Vấn đề với cách này là gì? Nó liên kết các mảnh với một hoạt động cụ thể, giảm khả năng sử dụng lại. Vậy thì cách nào được khuyến nghị?

Google khuyên bạn nên sử dụng tài liệu giao diện (trước ViewModel). Đối với điều này, chúng ta phải thực hiện giao diện trong lớp hoạt động. Các mảnh con sẽ giữ một tham chiếu của giao diện được thực hiện bởi hoạt động. Dữ liệu sẽ được truyền qua các phương thức giao diện.

luồng công việc của giao tiếp sử dụng giao diện

Hãy giả sử một kịch bản đơn giản trong đó chúng ta có hai phân đoạn trong cùng một hoạt động, một để nhập một số và một phân đoạn khác là hiển thị gấp đôi (2 x đầu vào). Hoạt động cũng sẽ hiển thị một thông báo Đầu vào của bạn là 123 như thế này.

Bạn có thể tưởng tượng chúng ta cần viết bao nhiêu mã và bao nhiêu kịch bản chúng ta phải xử lý. Tôi không đi sâu vào chi tiết về nó vì bài viết này là về giải pháp đơn giản hơn là trình diễn giao diện. Bạn có thể tìm thấy việc thực hiện ở đây.

Cách dễ dàng

Ở đây có ViewModel để giải cứu chúng ta khỏi việc xử lý nhiều kịch bản và giao diện triển khai. Chúng ta chỉ cần tạo lớp ViewModel và tạo cá thể trong đoạn nhưng sử dụng phạm vi hoạt động để nó có sẵn cho tất cả các đoạn của hoạt động bao gồm cả chính hoạt động.

luồng công việc của truyền thông bằng ViewModel

Tạo một lớp ViewModel

lớp SharedViewModel: ViewModel () {
    val inputNumber = MutableLiveData  ()
}

Để phát hoặc truyền dữ liệu từ đoạn đầu vào của chúng tôi, hãy tạo ViewModel trong phạm vi hoạt động. Để làm điều này, chúng ta phải chuyển tham chiếu hoạt động dưới dạng đối số của phương thức ViewModelProvides.of (). Noe chỉ truyền dữ liệu cho đối tượng ViewModel như thế này

hoạt động? .let {
    sharedViewModel = ViewModelProviders.of (nó) .get (SharedViewModel :: class.java)
}

et_input.addTextChangedListener (đối tượng: TextWatcher {
    ghi đè lên niềm vui sauTextChanged (p0: Có thể chỉnh sửa?) {}

    ghi đè lên niềm vui trướcTextChanged (p0: CharSequence?, p1: Int, p2: Int, p3: Int) {}

    ghi đè lên niềm vui trên TexChanged (txt: CharSequence?, p1: Int, p2: Int, p3: Int) {
        txt? .let {
            đầu vào var = 0
            if (txt.toString (). isNotEmpty ()) {
                đầu vào = txt.toString (). toInt ()
            }

            sharedViewModel? .inputNumber? .postValue (đầu vào)
        }
    }

Trong hoạt động, chúng ta chỉ cần tạo cá thể của ViewModel và quan sát dữ liệu cần thiết như thế này

val sharedViewModel = ViewModelProviders.of (này) .get (SharedViewModel :: class.java)

sharedViewModel.inputNumber.observe (cái này, Người quan sát {
    nó? .let {
        // làm một số điều với số
    }
})

Bây giờ những gì về đầu ra mảnh? Chúng ta có thể làm tương tự cho đoạn đầu ra để quan sát dữ liệu. Nhưng hãy nhớ rằng chúng ta cần tạo cá thể ViewModel trong phạm vi hoạt động, nếu không, Android sẽ tạo một cá thể riêng thay vì chia sẻ cùng một thể hiện và chúng ta sẽ không nhận được dữ liệu.

Đối với đoạn đầu ra làm như thế này

hoạt động? .let {
    val sharedViewModel = ViewModelProviders.of (nó) .get (SharedViewModel :: class.java)

    sharedViewModel.inputNumber.observe (cái này, Người quan sát {
    nó? .let {
            // làm một số điều với số
        }
    })
}

Đó là nó. Mã nguồn có thể được tìm thấy ở đây.

Thảo luận về StackOverflow

Mã hóa hạnh phúc