ตั้งค่าผู้จัดส่ง

หากต้องการใช้ระบบการนำทางที่มีประสิทธิภาพ แอปของคุณต้องมีวิธีแบบรวมศูนย์เพื่อ จัดการท่าทางสัมผัสย้อนกลับและสัญญาณการนำทางอื่นๆ หน้านี้อธิบายวิธีใช้ NavigationEventDispatcher เพื่อประสานงานและกระจายเหตุการณ์การนำทางเหล่านี้ในแอปพลิเคชัน

ประกาศ NavigationEventDispatcher

NavigationEventDispatcher เป็นองค์ประกอบหลักของไลบรารี NavigationEvent โดยจะทําหน้าที่เป็นฮับเหตุการณ์ที่ส่งเหตุการณ์ที่เกี่ยวข้องกับการนำทาง เช่น ท่าทางสัมผัสย้อนกลับและการเปลี่ยนผ่านการนำทาง ไปยังผู้ฟังที่ลงทะเบียนไว้ภายในแอป คอมโพเนนต์สามารถติดตามเหตุการณ์เหล่านี้เพื่อตอบสนองต่อการเปลี่ยนแปลงการนำทางหรือการดำเนินการนำทางอื่นๆ ที่ระบบเป็นผู้ขับเคลื่อน

คุณควรระบุอินสแตนซ์ NavigationEventDispatcher ผ่าน NavigationEventDispatcherOwner วิธีนี้ช่วยให้ส่วนต่างๆ ของแอปเข้าถึง Dispatcher เดียวกันและสังเกตเหตุการณ์การนำทางได้อย่างสอดคล้องและประสานกัน

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

หากคุณอยู่ใน ComponentActivity คุณสามารถเรียกข้อมูลตัวจัดสรรที่ระบบจัดให้แทนการใช้ตัวจัดสรรของคุณเองได้

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

เพิ่มNavigationEventInput

เมื่อลงทะเบียนแฮนเดิลแล้ว คุณก็พร้อมรับเหตุการณ์ อย่างไรก็ตาม คุณต้องระบุแหล่งที่มาซึ่งสร้างเหตุการณ์ด้วย NavigationEventInput

NavigationEventInput คือคอมโพเนนต์เฉพาะแพลตฟอร์มที่รับ อินพุตระบบดิบและแปลเป็น NavigationEvent มาตรฐานเพื่อส่ง ไปยัง NavigationEventDispatcher

ตัวอย่างต่อไปนี้เป็นการใช้งาน 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()
    }
}

จากนั้นให้ข้อมูลดังกล่าวแก่ผู้จัดส่ง

navigationEventDispatcher.addInput(MyInput())

ล้างข้อมูลทรัพยากรด้วย dispose()

หากต้องการป้องกันการรั่วไหลของหน่วยความจำใน UI แบบไดนามิก คุณต้องนำอินสแตนซ์ที่สร้างขึ้นแต่ละรายการออกจากลำดับชั้นอย่างชัดแจ้งโดยใช้เมธอด dispose() เมื่อคอมโพเนนต์ที่เชื่อมโยงกับอินสแตนซ์นั้นถูกทำลายNavigationEventDispatcher

navigationEventDispatcher.dispose()

dispose() วิธีนี้ช่วยให้การล้างข้อมูลแบบต่อเนื่องโดยการนำตัวจัดสรรและรายการที่สืบทอดทั้งหมด (รายการย่อยและรายการย่อยของรายการย่อย) ออกซ้ำๆ เพื่อให้มั่นใจว่าระบบจะยกเลิกการลงทะเบียนตัวแฮนเดิลที่เชื่อมโยงทั้งหมดจากระบบที่ใช้ร่วมกัน

ลำดับชั้นและการควบคุมผู้จัดส่ง

NavigationEventDispatcher รองรับลำดับชั้นหลัก-ย่อย ซึ่งช่วยให้คอมโพเนนต์ที่ซ้อนกันลึกภายใน UI (เช่น NavHost หรือกล่องโต้ตอบที่ซ้อนกัน) มีส่วนร่วมในการจัดการเหตุการณ์การนำทางได้

สร้าง Dispatcher ย่อย

ระบบจะสร้างตัวจัดสรรงานย่อยโดยส่งการอ้างอิงไปยังตัวจัดสรรงานหลัก ในระหว่างการสร้าง Dispatcher ทั้งหมดในลําดับชั้นใช้ NavigationEventProcessor เดียวกันเพื่อรักษาการจัดลําดับเหตุการณ์แบบเข้าทีหลังออกก่อน (LIFO) ทั่วโลกตามลําดับความสําคัญ

การเปิดใช้แบบลำดับชั้น

Dispatcher มีพร็อพเพอร์ตี้ isEnabled ที่ช่วยให้นักพัฒนาแอปเปิดใช้หรือปิดใช้ทั้ง Subtree ของแฮนเดิลพร้อมกันได้

เมื่อปิดใช้ Dispatcher หลัก (isEnabled = false) ระบบจะไม่สนใจแฮนเดิลเลอร์ทั้งหมด ที่เชื่อมโยงกับ Dispatcher หลักนั้นและ Dispatcher ย่อยใดๆ ไม่ว่า สถานะที่เปิดใช้ของแต่ละรายการจะเป็นอย่างไร