Kotlin DSL 和 Navigation Compose 中的類型安全

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

這些 API 相當於 Safe Args 提供給導覽圖 以 XML 建構而成

定義路徑

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

  • 物件:針對不含引數的路徑使用物件。
  • 類別:針對含有引數的路線,使用類別或資料類別。
  • 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") 中。
  • route 類別定義每個導覽引數的類型,如 val id: String,因此不需要 NavArgument
  • 針對設定檔路徑,toRoute() 擴充功能方法會重新建立 NavBackStackEntry 及其所含的 Profile 物件 引數。

如需更多有關如何一般設計圖表的資訊,請參閱「設計 「導覽圖」頁面中。

最後,您可以使用 navigate() 導覽至可組合函式 函式,方法是傳入路徑的例項:

navController.navigate(Profile(id = 123))

這會將使用者導向至 composable<Profile> 目的地 導覽圖任何導覽引數,例如 id,都可以透過 使用 NavBackStackEntry.toRoute 重新建構 Profile,並讀取其 資源。

其他資源