您可以使用內建的類型安全 API,為導覽圖提供編譯時間類型安全。當應用程式使用 Navigation Compose 或 Navigation Kotlin DSL 時,即可使用這些 API。自 Navigation
2.8.0
起提供。
這些 API 與 Safe Args 為使用 XML 建構的導覽圖提供的功能相同。
定義路徑
如要在 Compose 中使用型別安全的路徑,您必須先定義可順序化的類別或物件,以代表路徑。
如要定義可序列化的物件,請使用 Kotlin 序列化外掛程式提供的 @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>
。- 定義目的地類型比傳遞
composable("profile")
中的route
字串更可靠。 - 路徑類別會定義每個導覽引數的類型,如
val id: String
中所示,因此不需要NavArgument
。 - 針對設定檔路徑,
toRoute()
擴充功能方法會根據NavBackStackEntry
及其引數,重新建立Profile
物件。
如要進一步瞭解如何設計一般圖表,請參閱「設計導覽圖」頁面。
前往類型安全路徑
最後,您可以傳入路徑的例項,使用 navigate()
函式前往可組合項:
navController.navigate(Profile(id = 123))
這會將使用者導向導覽圖中的 composable<Profile>
目的地。您可以使用 NavBackStackEntry.toRoute
重建 Profile
,然後讀取其屬性,藉此取得任何導覽引數 (例如 id
)。