พิมพ์ความปลอดภัยใน Kotlin DSL และการเขียนการนำทาง

คุณสามารถใช้ API ที่ปลอดภัยตามประเภทในตัวเพื่อให้มีความปลอดภัยตามประเภทของเวลาคอมไพล์สำหรับกราฟการนำทางได้ API เหล่านี้จะพร้อมใช้งานเมื่อแอปใช้ Navigation Compose หรือ Navigation Kotlin DSL โดยจะเริ่มใช้งานได้ตั้งแต่วันที่ Navigation 2.8.0

API เหล่านี้เทียบเท่ากับสิ่งที่ Safe Args มีให้สำหรับกราฟการนําทางที่สร้างขึ้นโดยใช้ XML

กำหนดเส้นทาง

หากต้องการใช้เส้นทางที่ปลอดภัยต่อประเภทใน Compose ก่อนอื่นคุณต้องกำหนดคลาสหรือออบเจ็กต์ที่แสดงถึงเส้นทางของคุณซึ่งสามารถจัดเก็บเป็นอนุกรมได้

หากต้องการกำหนดออบเจ็กต์ที่ serialize ได้ ให้ใช้คำอธิบายประกอบ @Serializable ที่ได้จากปลั๊กอินการแปลงข้อมูลโคตลิน คุณเพิ่มปลั๊กอินนี้ลงในโปรเจ็กต์ได้โดยเพิ่มข้อกําหนดเหล่านี้

ใช้กฎต่อไปนี้เพื่อตัดสินใจว่าจะใช้ประเภทใดสำหรับเส้นทาง

  • ออบเจ็กต์: ใช้ออบเจ็กต์สำหรับเส้นทางที่ไม่มีอาร์กิวเมนต์
  • คลาส: ใช้คลาสหรือคลาสข้อมูลสำหรับเส้นทางที่มีอาร์กิวเมนต์
  • KClass<T>: ใช้ในกรณีที่ไม่จําเป็นต้องส่งอาร์กิวเมนต์ เช่น คลาสที่ไม่มีพารามิเตอร์ หรือคลาสที่พารามิเตอร์ทั้งหมดมีค่าเริ่มต้น
    1. ตัวอย่างเช่น Profile::class

ไม่ว่าในกรณีใด ออบเจ็กต์หรือคลาสจะต้องเป็นรูปแบบที่ต่อเนื่องได้

เช่น

// Define a home route that doesn't take any arguments
@Serializable
object Home

// Define a profile route that takes an ID
@Serializable
data class Profile(val id: String)

สร้างกราฟ

ขั้นตอนต่อไปคือกำหนดกราฟการนําทาง ใช้ฟังก์ชัน composable() เพื่อกำหนดคอมโพสิเบิลเป็นปลายทางในกราฟการนำทาง

NavHost(navController, startDestination = Home) {
     composable<Home> {
         HomeScreen(onNavigateToProfile = { id ->
             navController.navigate(Profile(id))
         })
     }
     composable<Profile> { backStackEntry ->
         val profile: Profile = backStackEntry.toRoute()
         ProfileScreen(profile.id)
     }
}

โปรดสังเกตสิ่งต่อไปนี้ในตัวอย่างนี้

  • composable() ใช้พารามิเตอร์ประเภท นั่นคือ composable<Profile>
  • การกําหนดประเภทปลายทางเป็นแนวทางที่มีประสิทธิภาพมากกว่าการส่งสตริง route ดังใน composable("profile")
  • คลาสเส้นทางจะกำหนดประเภทของอาร์กิวเมนต์การนำทางแต่ละรายการ ดังใน val id: String จึงไม่จำเป็นต้องใช้ NavArgument
  • สำหรับเส้นทางโปรไฟล์ เมธอดส่วนขยาย toRoute() จะสร้างออบเจ็กต์ Profile ขึ้นมาใหม่จาก NavBackStackEntry และอาร์กิวเมนต์

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีออกแบบกราฟโดยทั่วไปได้ที่หน้าออกแบบกราฟการนําทาง

สุดท้าย คุณสามารถไปยังคอมโพสิเบิลโดยใช้ฟังก์ชัน navigate() โดยส่งอินสแตนซ์ของเส้นทาง

navController.navigate(Profile(id = 123))

ซึ่งจะนำผู้ใช้ไปยังcomposable<Profile>ปลายทางในกราฟการนําทาง คุณรับอาร์กิวเมนต์การนำทาง เช่น id ได้โดยการสร้าง Profile ขึ้นมาใหม่โดยใช้ NavBackStackEntry.toRoute และอ่านพร็อพเพอร์ตี้ของ Profile

แหล่งข้อมูลเพิ่มเติม