หากต้องการใช้ระบบการนำทางที่มีประสิทธิภาพ แอปของคุณต้องมีวิธีแบบรวมศูนย์เพื่อ
จัดการท่าทางสัมผัสย้อนกลับและสัญญาณการนำทางอื่นๆ หน้านี้อธิบายวิธีใช้ 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 ย่อยใดๆ ไม่ว่า
สถานะที่เปิดใช้ของแต่ละรายการจะเป็นอย่างไร