ส่วนต่อไปนี้จะอธิบายกลยุทธ์ในการบันทึกสแต็กย้อนกลับและ จัดเก็บสถานะที่เชื่อมโยงกับรายการในสแต็กย้อนกลับ
บันทึกสแต็กย้อนกลับ
การตรวจสอบว่าสถานะการนำทางของแอปยังคงอยู่ตลอดเหตุการณ์วงจรต่างๆ
รวมถึงการเปลี่ยนแปลงการกำหนดค่าและการสิ้นสุดกระบวนการเป็นสิ่งสำคัญต่อประสบการณ์ของผู้ใช้ที่ดี
ใน Navigation 3 คุณเป็นเจ้าของ Back Stack จึงไม่มี
หลักเกณฑ์ที่เข้มงวดเกี่ยวกับวิธีสร้างหรือบันทึก อย่างไรก็ตาม Navigation 3 มี
วิธีการที่สะดวกซึ่งช่วยให้คุณบันทึก Back Stack ได้ ดังนี้
rememberNavBackStack
ใช้ rememberNavBackStack
rememberNavBackStack Composable Function ออกแบบมาเพื่อสร้าง Back Stack ที่ยังคงอยู่เมื่อมีการเปลี่ยนแปลงการกำหนดค่าและกระบวนการสิ้นสุด
หากต้องการให้ rememberNavBackStack ทำงานได้อย่างถูกต้อง คีย์แต่ละรายการในสแต็กย้อนกลับ
ต้องเป็นไปตามข้อกำหนดต่อไปนี้
- ใช้
NavKeyอินเทอร์เฟซ: คีย์ทุกรายการในสแต็กย้อนกลับต้องใช้ อินเทอร์เฟซNavKeyซึ่งทำหน้าที่เป็นอินเทอร์เฟซเครื่องหมายที่ส่งสัญญาณไปยัง ไลบรารีว่าบันทึกคีย์ได้ - มี
@Serializableคำอธิบายประกอบ: นอกเหนือจากการใช้NavKeyแล้ว คุณต้องทำเครื่องหมายคลาสและออบเจ็กต์หลักด้วย@Serializableคำอธิบายประกอบ
ข้อมูลโค้ดต่อไปนี้แสดงการติดตั้งใช้งาน rememberNavBackStack อย่างถูกต้อง
@Serializable data object Home : NavKey @Composable fun NavBackStack() { val backStack = rememberNavBackStack(Home) }
อีกทางเลือก: จัดเก็บใน ViewModel
อีกวิธีหนึ่งในการจัดการสแต็กย้อนกลับคือการจัดเก็บไว้ใน ViewModel
หากต้องการให้ข้อมูลคงอยู่เมื่อกระบวนการสิ้นสุดลงเมื่อใช้ ViewModel หรือพื้นที่เก็บข้อมูลที่กำหนดเองอื่นๆ
คุณต้องทำดังนี้
- ตรวจสอบว่าคีย์ของคุณสามารถแปลงเป็นอนุกรมได้: เช่นเดียวกับ
rememberNavBackStackคีย์การนำทางต้องแปลงเป็นอนุกรมได้ - จัดการการซีเรียลไลซ์และการดีซีเรียลไลซ์ด้วยตนเอง: คุณมีหน้าที่รับผิดชอบในการ
บันทึกการแสดงที่ซีเรียลไลซ์ของแต่ละคีย์ลงใน
พื้นที่เก็บข้อมูลแบบถาวร (เช่น
SharedPreferences, ฐานข้อมูล หรือไฟล์) เมื่อแอปเข้าสู่เบื้องหลังหรือได้รับการ กู้คืน
การกำหนดขอบเขต ViewModel วินาทีถึง NavEntry วินาที
ViewModels ใช้เพื่อคงสถานะที่เกี่ยวข้องกับ UI ไว้เมื่อมีการเปลี่ยนแปลงการกำหนดค่า
เช่น การหมุนหน้าจอ โดยค่าเริ่มต้น ViewModels จะกำหนดขอบเขตไว้ที่
ViewModelStoreOwnerที่ใกล้ที่สุด ซึ่งโดยปกติคือ Activity หรือ Fragment
อย่างไรก็ตาม คุณอาจต้องการกำหนดขอบเขต ViewModel ให้กับ NavEntry ที่เฉพาะเจาะจง (เช่น หน้าจอหรือปลายทางที่เฉพาะเจาะจง) ใน Back Stack แทนที่จะเป็น Activity ทั้งหมด ซึ่งจะช่วยให้มั่นใจว่าระบบจะคงสถานะของ ViewModel ไว้เฉพาะในขณะที่ NavEntry นั้นเป็นส่วนหนึ่งของสแต็กย้อนกลับ และจะล้างเมื่อมีการป๊อป NavEntry
androidx.lifecycle:lifecycle-viewmodel-navigation3 ไลบรารีส่วนเสริมมีNavEntryDecoratorที่ช่วยให้ทำสิ่งนี้ได้ ตัวตกแต่งนี้จะให้ ViewModelStoreOwner สำหรับแต่ละ NavEntry เมื่อคุณสร้าง ViewModel ภายในเนื้อหาของ NavEntry (เช่น ใช้ viewModel() ใน Compose) ระบบจะกำหนดขอบเขตโดยอัตโนมัติ
ไปยังคีย์ของ NavEntry นั้นใน Back Stack ซึ่งหมายความว่า
ViewModel จะสร้างขึ้นเมื่อมีการเพิ่ม NavEntry ลงในสแต็กย้อนกลับ และ
จะล้างเมื่อมีการนำออก
หากต้องการใช้ NavEntryDecorator เพื่อกำหนดขอบเขต ViewModel ให้กับ NavEntry ให้ทำตามขั้นตอนต่อไปนี้
- เพิ่มทรัพยากร Dependency
androidx.lifecycle:lifecycle-viewmodel-navigation3ลงในไฟล์app/build.gradle.kts - เพิ่ม
rememberSaveableStateHolderNavEntryDecorator()ลงในรายการentryDecoratorsเมื่อสร้างNavDisplay - เพิ่มตัวตกแต่งอื่นๆ ลงใน
NavDisplay
NavDisplay( entryDecorators = listOf( // Add the default decorators for managing scenes and saving state rememberSaveableStateHolderNavEntryDecorator(), // Then add the view model store decorator rememberViewModelStoreNavEntryDecorator() ), backStack = backStack, entryProvider = entryProvider { }, )