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

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

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

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

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

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

ในทั้ง 2 กรณี ออบเจ็กต์หรือคลาสต้องเป็นแบบทำให้อนุกรมได้

เช่น

// 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() เพื่อกำหนด 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 และออบเจ็กต์ อาร์กิวเมนต์

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

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

navController.navigate(Profile(id = 123))

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

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