คุณสามารถใช้ API ที่ปลอดภัยตามประเภทในตัวเพื่อให้มีความปลอดภัยตามประเภทของเวลาคอมไพล์สำหรับกราฟการนำทางได้ API เหล่านี้จะพร้อมใช้งานเมื่อแอปใช้ Navigation Compose หรือ Navigation Kotlin DSL โดยจะเริ่มใช้งานได้ตั้งแต่วันที่ Navigation
2.8.0
API เหล่านี้เทียบเท่ากับสิ่งที่ Safe Args มีให้สำหรับกราฟการนําทางที่สร้างขึ้นโดยใช้ XML
กำหนดเส้นทาง
หากต้องการใช้เส้นทางที่ปลอดภัยต่อประเภทใน Compose ก่อนอื่นคุณต้องกำหนดคลาสหรือออบเจ็กต์ที่แสดงถึงเส้นทางของคุณซึ่งสามารถจัดเก็บเป็นอนุกรมได้
หากต้องการกำหนดออบเจ็กต์ที่ serialize ได้ ให้ใช้คำอธิบายประกอบ @Serializable
ที่ได้จากปลั๊กอินการแปลงข้อมูลโคตลิน
คุณเพิ่มปลั๊กอินนี้ลงในโปรเจ็กต์ได้โดยเพิ่มข้อกําหนดเหล่านี้
ใช้กฎต่อไปนี้เพื่อตัดสินใจว่าจะใช้ประเภทใดสำหรับเส้นทาง
- ออบเจ็กต์: ใช้ออบเจ็กต์สำหรับเส้นทางที่ไม่มีอาร์กิวเมนต์
- คลาส: ใช้คลาสหรือคลาสข้อมูลสำหรับเส้นทางที่มีอาร์กิวเมนต์
KClass<T>
: ใช้ในกรณีที่ไม่จําเป็นต้องส่งอาร์กิวเมนต์ เช่น คลาสที่ไม่มีพารามิเตอร์ หรือคลาสที่พารามิเตอร์ทั้งหมดมีค่าเริ่มต้น- ตัวอย่างเช่น
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