Kotlin DSL 和 Navigation Compose 中的類型安全

您可以使用內建的類型安全 API,為導覽圖提供編譯時間類型安全。當應用程式使用 Navigation ComposeNavigation Kotlin DSL 時,即可使用這些 API。自 Navigation 2.8.0 起提供。

這些 API 與 Safe Args 為使用 XML 建構的導覽圖提供的功能相同。

定義路徑

如要在 Compose 中使用型別安全的路徑,您必須先定義可順序化的類別或物件,以代表路徑。

如要定義可序列化的物件,請使用 Kotlin 序列化外掛程式提供的 @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>
  • 定義目的地類型比傳遞 composable("profile") 中的 route 字串更可靠。
  • 路徑類別會定義每個導覽引數的類型,如 val id: String 中所示,因此不需要 NavArgument
  • 針對設定檔路徑,toRoute() 擴充功能方法會根據 NavBackStackEntry 及其引數,重新建立 Profile 物件。

如要進一步瞭解如何設計一般圖表,請參閱「設計導覽圖」頁面。

最後,您可以傳入路徑的例項,使用 navigate() 函式前往可組合項:

navController.navigate(Profile(id = 123))

這會將使用者導向導覽圖中的 composable<Profile> 目的地。您可以使用 NavBackStackEntry.toRoute 重建 Profile,然後讀取其屬性,藉此取得任何導覽引數 (例如 id)。

其他資源