บันทึกและจัดการสถานะการนําทาง

ส่วนต่อไปนี้จะอธิบายกลยุทธ์ในการบันทึกสแต็กย้อนกลับและ จัดเก็บสถานะที่เชื่อมโยงกับรายการในสแต็กย้อนกลับ

บันทึกสแต็กย้อนกลับ

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

  1. เพิ่มทรัพยากร Dependency androidx.lifecycle:lifecycle-viewmodel-navigation3 ลงในไฟล์ app/build.gradle.kts
  2. เพิ่ม rememberSaveableStateHolderNavEntryDecorator() ลงในรายการ entryDecorators เมื่อสร้าง NavDisplay
  3. เพิ่มตัวตกแต่งอื่นๆ ลงใน 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 { },
)