ส่วนต่อไปนี้จะอธิบายกลยุทธ์ในการบันทึกสแต็กย้อนกลับและ จัดเก็บสถานะที่เชื่อมโยงกับรายการในสแต็กย้อนกลับ
บันทึกสแต็กย้อนกลับ
การตรวจสอบว่าสถานะการนำทางของแอปยังคงอยู่ตลอดเหตุการณ์วงจรต่างๆ
รวมถึงการเปลี่ยนแปลงการกำหนดค่าและการสิ้นสุดกระบวนการเป็นสิ่งสำคัญต่อประสบการณ์ของผู้ใช้ที่ดี
ใน Navigation 3 คุณเป็นเจ้าของ Back Stack จึงไม่มี
หลักเกณฑ์ที่เข้มงวดเกี่ยวกับวิธีสร้างหรือบันทึก อย่างไรก็ตาม Navigation 3 มี
วิธีการที่สะดวกซึ่งช่วยให้คุณบันทึก Back Stack ได้ ดังนี้
rememberNavBackStack
ใช้ rememberNavBackStack
ฟังก์ชันที่ประกอบกันได้ rememberNavBackStack ออกแบบมาเพื่อสร้างสแต็กย้อนกลับ
ที่ยังคงอยู่เมื่อมีการเปลี่ยนแปลงการกำหนดค่าและกระบวนการสิ้นสุด
หากต้องการให้ 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 - เพิ่ม
rememberViewModelStoreNavEntryDecorator()ลงในรายการentryDecorators
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 { }, )