Thiết lập trình điều phối

Để triển khai một hệ thống điều hướng mạnh mẽ, ứng dụng của bạn cần có một cách tập trung để xử lý các cử chỉ quay lại và các tín hiệu điều hướng khác. Trang này mô tả cách sử dụng NavigationEventDispatcher để điều phối và phân phối các sự kiện điều hướng này trên ứng dụng của bạn.

Khai báo một NavigationEventDispatcher

NavigationEventDispatcher là thành phần trung tâm của thư viện NavigationEvent. Nó hoạt động như một trung tâm sự kiện gửi các sự kiện liên quan đến thao tác điều hướng (chẳng hạn như cử chỉ quay lại và hiệu ứng chuyển đổi điều hướng) đến các trình nghe đã đăng ký trong ứng dụng của bạn. Các thành phần có thể đăng ký các sự kiện này để phản ứng với các thay đổi về thao tác điều hướng hoặc các thao tác điều hướng khác do hệ thống điều khiển.

Bạn nên cung cấp các thực thể NavigationEventDispatcher thông qua NavigationEventDispatcherOwner. Điều này đảm bảo rằng các phần khác nhau của ứng dụng có thể truy cập vào cùng một trình điều phối và theo dõi các sự kiện điều hướng một cách nhất quán và phối hợp.

class MyComponent: NavigationEventDispatcherOwner {
    override val navigationEventDispatcher: NavigationEventDispatcher =
        NavigationEventDispatcher()
}

Nếu đang ở trong ComponentActivity, thay vì triển khai bộ điều phối của riêng mình, bạn có thể truy xuất bộ điều phối được cung cấp cho mình.

class MyCustomActivity : ComponentActivity() {
    fun addMyHandler() {
        // navigationEventDispatcher provided by the ComponentActivity
        navigationEventDispatcher.addHandler(myNavigationEventHandler)
    }
}

Thêm một NavigationEventInput

Bây giờ, khi đã đăng ký trình xử lý, bạn có thể nhận được các sự kiện. Tuy nhiên, bạn cần cung cấp một nguồn mà từ đó các sự kiện được tạo bằng NavigationEventInput.

NavigationEventInput là thành phần dành riêng cho nền tảng, nhận dữ liệu đầu vào thô của hệ thống và dịch dữ liệu đó thành NavigationEvent tiêu chuẩn để gửi đến NavigationEventDispatcher.

Ví dụ sau đây là một cách triển khai tuỳ chỉnh của NavigationEventInput:

public class MyInput : NavigationEventInput() {
    @MainThread
    public fun backStarted(event: NavigationEvent) {
        dispatchOnBackStarted(event)
    }

    @MainThread
    public fun backProgressed(event: NavigationEvent) {
        dispatchOnBackProgressed(event)
    }

    @MainThread
    public fun backCancelled() {
        dispatchOnBackCancelled()
    }

    @MainThread
    public fun backCompleted() {
        dispatchOnBackCompleted()
    }
}

Tiếp theo, hãy cung cấp dữ liệu đầu vào đó cho trình điều phối của bạn:

navigationEventDispatcher.addInput(MyInput())

Dọn dẹp tài nguyên bằng dispose()

Để ngăn chặn tình trạng rò rỉ bộ nhớ trong giao diện người dùng động, mọi thực thể NavigationEventDispatcher đã tạo phải được xoá rõ ràng khỏi hệ phân cấp bằng phương thức dispose() khi thành phần mà thực thể đó được liên kết bị huỷ:

navigationEventDispatcher.dispose()

Phương thức dispose() đảm bảo dọn dẹp theo tầng bằng cách lặp lại việc xoá trình điều phối và tất cả các phần tử con cháu của trình điều phối (phần tử con và phần tử cháu), đảm bảo rằng tất cả các trình xử lý được liên kết đều được huỷ đăng ký khỏi hệ thống dùng chung.

Hệ phân cấp và quyền kiểm soát của điều phối viên

NavigationEventDispatcher hỗ trợ hệ phân cấp mẹ con, cho phép các thành phần được lồng sâu trong giao diện người dùng (chẳng hạn như NavHost hoặc hộp thoại lồng nhau) tham gia vào quá trình xử lý sự kiện điều hướng.

Tạo trình điều phối con

Trình điều phối con được tạo bằng cách truyền một tham chiếu đến trình điều phối mẹ trong quá trình tạo. Tất cả các trình điều phối trong một hệ thống phân cấp đều dùng chung cùng một NavigationEventProcessor để duy trì thứ tự sự kiện Vào sau ra trước (LIFO) dựa trên mức độ ưu tiên.

Bật theo phân cấp

Trình điều phối bao gồm một thuộc tính isEnabled cho phép nhà phát triển bật hoặc tắt toàn bộ cây con của trình xử lý cùng một lúc.

Khi một trình điều phối mẹ bị tắt (isEnabled = false), tất cả các trình xử lý được liên kết với trình điều phối mẹ đó và mọi trình xử lý con của trình điều phối mẹ đó sẽ bị bỏ qua, bất kể trạng thái bật riêng lẻ của chúng.