### Jetpack Compose 導航的過去問題 - 需要手動定義每個參數的類型、是否可選、預設值等 - 參數傳遞錯誤可能導致應用程式崩潰 - 字串參數需要編碼處理,否則特殊字元會影響路由 - 大量樣板(boilerplate)代碼,影響開發效率 ### 全新的類型安全(Type-Safe)導航 - Jetpack Compose 新增官方支援類型安全的導航 - 不再使用字串路由,而是透過 Kotlin 類別(KClass)定義路由 - 不需要額外的導航函式庫,只需官方 Jetpack Navigation ### 新導航系統的依賴與設定 ![image](https://hackmd.io/_uploads/SyhZtvr3kx.png) - 需要新增 `navigation-compose` 依賴(版本 `2.8.0-alpha81`) - 使用 `kotlinx-serialization-json` 來進行參數序列化 - 需要在 `build.gradle` 中啟用 Kotlin 序列化插件 ### 設定 `NavHost` - 創建 `navController`,定義 `NavHost` 並設定起始畫面 - 透過 `KClass` 指定 `startDestination`,例如 `ScreenA::class` ### 定義畫面與路由 - 透過 `@Serializable` 註解標記畫面類別 - 例如 `object ScreenA : ScreenRoute()` 作為第一個畫面 - 第二個畫面 `ScreenB` 則使用 `data class`,並帶有可選與必填參數 ### 傳遞與接收參數 - 透過 `ScreenB(name = "William", age = 25)` 進行導航 - 在 `ScreenB` 內使用 `backStackEntry.toRoute<ScreenB>()` 取得參數 - 可選參數可設為 `null`,未傳遞時不會影響應用運行 ### 優勢與未來展望 - 更簡潔的代碼,減少錯誤機率 - 內建支援 `Parcelable` 參數傳遞(需要額外設定) - 建議傳遞 `ID` 而非完整物件,避免影響效能 - Jetpack Compose、Kotlin Multiplatform 等生態系持續發展 # Terminology - **Type-Safe Navigation(類型安全導航)**:允許使用 Kotlin 類別而非字串來定義導航目的地,避免路由錯誤。 - **Serializable**:Kotlin 提供的序列化註解,允許類別被轉換為可傳輸的格式,如 JSON。 - **Kotlinx Serialization**:Kotlin 的官方序列化庫,用於將物件轉換為 JSON 等格式。 - **NavController**:Jetpack Compose 的導航控制器,負責管理畫面之間的切換。 - **NavHost**:Jetpack Compose 中的組件,負責顯示當前導航目的地的 Composable。 - **Start Destination(起始目的地)**:應用程式啟動時首先顯示的畫面。 - **KClass**:Kotlin 反射 API 的類型,允許在程式執行時操作類別資訊。 - **NavBackStackEntry**:保存當前導航狀態的物件,包括傳遞的參數。 - **Route(路由)**:在導航系統中用於標識不同畫面的標誌,傳統上使用字串,現在可使用 Kotlin 類別。 - **Composable Function(可組合函式)**:Jetpack Compose 的 UI 單位,用於構建可重複使用的 UI 組件。 - **NavArgument**:Jetpack Compose 舊版導航系統中用於定義參數類型和可空性的新參數系統已被類型安全導航取代。 - **Nullable Argument(可空參數)**:允許參數接受 `null` 值,例如 `name: String?`。 - **Optional Argument(選擇性參數)**:在導航時非必須提供的參數,可使用 `null` 或設置預設值。 - **Mandatory Argument(必需參數)**:導航時必須提供的參數,例如 `age: Int`。 - **Encoding(編碼)**:將特殊字元(如空格、問號)轉換為 URL 兼容格式,避免導航路徑錯誤。 - **Decoding(解碼)**:將編碼過的 URL 參數還原為原始格式,例如 `%20` 轉換回空格。 - **Build Gradle**:Android 項目的配置文件,定義依賴與建置流程。 - **Gradle Sync**:同步 Gradle 依賴,使專案與最新設定保持一致。 - **Gradle Plugin**:擴展 Gradle 功能的插件,例如 `kotlinx-serialization` 用於序列化支持。 - **Version Catalog**:Gradle 提供的功能,允許集中管理項目的所有依賴版本。 - **Dependency(依賴)**:Android 項目中所需的外部庫,例如 `navigation-compose`。 - **Jetpack Navigation Component**:Google 提供的導航工具,用於管理應用內的畫面切換。 - **Jetpack Compose**:Google 提供的現代 Android UI 工具,基於 Kotlin 的宣告式 UI 框架。 - **Column**:Jetpack Compose 提供的佈局容器,將子元件垂直排列。 - **Box**:Jetpack Compose 提供的容器,可用於重疊或自由擺放 UI 元件。 - **Arrangement.Center**:Jetpack Compose 佈局參數,將內容垂直置中對齊。 - **Alignment.CenterHorizontally**:Jetpack Compose 佈局參數,將內容水平置中對齊。 - **Button**:Jetpack Compose 提供的按鈕元件,可用於觸發操作。 - **Text**:Jetpack Compose 的基本 UI 元件,用於顯示文字。 - **Navigate(導航)**:透過 `navController.navigate()` 切換畫面。 - **Parcelable**:Android 提供的高效序列化機制,適用於在 Intent 或 Bundle 傳遞數據。 - **Argument Parsing(參數解析)**:從導航堆疊中提取並轉換傳遞的參數,例如 `val args = it.toRoute<ScreenB>()`。 - **Hardcoded Value(硬編碼值)**:直接在程式碼中指定固定值,如 `age = 25`,通常應避免。 - **Data Class**:Kotlin 提供的輕量級類別,用於封裝數據,例如 `data class ScreenB(val name: String?, val age: Int)`。 - **Instance Creation(實例建立)**:使用 `ScreenB("William", 25)` 創建類的實例。 - **Lambda Expression(Lambda 表達式)**:Kotlin 的匿名函式,常用於 Compose 的按鈕點擊事件。 - **Default Value(預設值)**:為函式參數或類屬性提供預設,例如 `name: String? = null`。 - **NavGraphBuilder**:Compose Navigation 的 DSL(領域專用語言),用於定義導航圖。 - **Navigation Destination(導航目的地)**:應用程式中的不同畫面,例如 `ScreenA` 和 `ScreenB`。 - **Recomposition(重組)**:Jetpack Compose 重新繪製 UI 的機制,可根據狀態變更更新畫面。 - **State Management(狀態管理)**:管理 UI 狀態,如 `remember { mutableStateOf(...) }`。 - **Jetpack ViewModel**:Android 架構元件之一,用於管理 UI 數據並與 Compose 整合。 - **Kotlin Multiplatform(KMP)**:Kotlin 的跨平台開發解決方案,支援共享 Android、iOS、Web 及桌面程式碼。 - **Jetpack Room**:Android 提供的本地資料庫框架,支援 Kotlin Multiplatform。 - **API Request(API 請求)**:從伺服器獲取數據,例如透過 Retrofit 取得用戶資料。 - **Database Fetching(數據庫獲取)**:從本地資料庫查找特定數據,例如根據 ID 取得用戶資訊。 - **Mentorship Program(指導計畫)**:個人化程式設計學習課程,提供程式碼審查與反饋。 - **Backward Compatibility(向後相容性)**:確保新版本的 Jetpack Compose 仍可支援舊專案。 - **Code Review(程式碼審查)**:開發過程中的品質控制,確保程式碼符合最佳實踐。 - **Boilerplate Code(樣板程式碼)**:重複且冗長的程式碼,例如舊版 Compose Navigation 需要大量設定。 - **Error-Prone(易出錯)**:某些開發模式(如手動構建路由字串)容易導致錯誤。