### 影片簡介
- 本影片介紹在 Jetpack Compose 專案中,不同畫面之間分享資料的五種方法,不涵蓋舊式 XML 或 Fragment 方式。
### Navigation Arguments
- 使用 NavHost 的 navArguments 傳遞資料,簡單直覺。
- 資料存在 SavedStateHandle 中,可自動處理 Process Death。
- 適合單次傳遞簡單型別資料。
- 無法有效傳遞複雜資料或多螢幕間的資料共享。
- 傳遞的是靜態資料,無法動態變更。
### Shared ViewModel
- 透過在導航子圖(Nested Navigation Graph)中共用 ViewModel,實現多螢幕共用相同狀態。
- 使用自訂方法從子圖的 BackStackEntry 綁定 ViewModel,讓 ViewModel 只在子圖清除時一起清除。
- 適合流程性畫面(如註冊流程)中多步驟累積資料,所有畫面可讀寫同一份狀態。
- 支援即時狀態變更,可透過 StateFlow 觀察更新,能儲存任何複雜資料。
- 預設無法支援 Process Death,但可透過 SavedStateHandle 手動保存與還原狀態。
- 若使用 Hilt 依賴注入,需要以 HiltViewModel 取代標準 ViewModel 實作。
- 相較於單純傳遞 Navigation Arguments,更方便管理大量資料且支援動態變更。
- 缺點是容易產生耦合,若狀態只屬於單一螢幕,需小心拆分或使用多個 ViewModel,否則會增加除錯與維護難度。
- 適用於功能明確且多畫面需要共享資料的模組,例如 Onboarding 流程、即時通訊或視訊會議功能。
---
### Sharing a Stateful Dependency
- 透過單例物件(如 Singleton)分享狀態,例如以 Dagger Hilt 建立全域計數器並注入至多個 ViewModel。
- 簡單快速可以共享同一份資料實例。
- 不推薦此方法,因為無法自然支援 Process Death,需要醜陋的手動還原流程。
- 單例無生命週期管理,若只需要在局部範圍使用,必須手動重置狀態,易出錯。
- 容易造成狀態錯誤延續,例如使用者登出後狀態未清除問題。
### CompositionLocals
- 使用 CompositionLocal 機制可在 Composable 中共享資料,避免層層參數傳遞。
- 適合場景如在整個應用中共用 Scaffold 的 SnackbarHostState。
- 可簡化資料共享,但僅限於 Composable 之間,無法在 ViewModel 中使用。
- 需注意如果預覽畫面(Preview)沒有提供 CompositionLocal 會導致錯誤或顯示異常。
- 遇到無法提供預設值的 CompositionLocal,建議改用傳參數或回調函式的方式避免錯誤。
### Persistent Storage
- 透過如 SharedPreferences 保存資料,實現跨螢幕的資料共享並支援 Process Death。
- 常用於管理如使用者登入 Session 等需持久保存的重要資料。
- 儲存於磁碟而非記憶體,資料可在應用被系統回收或重啟後保留。
- 登出時需統一清除 Session 資料,建議集中管理登出流程以避免遺漏。
- 適用於需要全域且持久資料的場景,如使用者資訊、設定檔等。
### Terminology
- **Compose**:Google 推出的現代化 Android UI 框架,以 Kotlin 編寫,取代傳統 XML 布局。
- **Navigation Arguments**:通過導航傳遞的資料,用於在不同畫面間共享簡單資料。
- **NavHost**:承載不同畫面(Composable)的容器,負責導航流程。
- **Composable**:Compose 中可重組的 UI 元件,像是函式。
- **NavBackStackEntry**:導航堆疊中的單一項目,包含路由與相關資料。
- **SavedStateHandle**:用於保存 ViewModel 中的資料,以應對進程死亡(Process Death)。
- **Parcelable**:Android 中高效能的序列化機制,用於傳遞複雜資料。
- **Process Death**:應用程式因資源緊張被系統終止的情況。
- **Shared ViewModel**:讓多個畫面共享相同 ViewModel 實例,達成資料同步。
- **Navigation Graph**:定義應用內所有畫面及其之間的導航路徑的結構圖。
- **Subgraph**:Navigation Graph 中的一部分,代表一個功能模組內的流程。
- **StateFlow**:Kotlin 中一種可觀察、可持續變更的資料流。
- **ViewModel**:保存 UI 相關資料的類別,讓資料在配置變更(如旋轉螢幕)時依然存在。
- **Scoped ViewModel**:將 ViewModel 綁定至特定導航圖(Subgraph)內,控制生命週期。
- **Remember**:Compose 中保存狀態於重組期間的函式。
- **NavController**:Compose Navigation 中管理畫面切換的控制器。
- **Inclusive PopUpTo**:從導航堆疊中移除直到特定畫面(包含該畫面)的所有畫面。
- **State Restoration**:應對 Process Death,恢復應用狀態的機制。
- **Onboarding Flow**:引導新用戶完成初步設置流程的一系列畫面。
- **Arguments Bundle**:用來打包導航參數的資料結構。
- **Single Activity Architecture**:整個應用僅有一個 Activity,所有畫面以 Fragment 或 Compose 形式載入。
- **Stateless Data**:資料在傳遞後不可變動。
- **Dynamic State**:可變動的應用狀態,通常透過 StateFlow 管理。
- **NavGraphRoute**:導航圖中某個節點的路由名稱。
- **Lockcat Terminate Application**:Android Studio 提供的模擬 Process Death 的功能。
- **Parcelable Limitations**:限制了只能傳遞能序列化成 Parcelable 的資料類型。
- **State Coupling**:多個元件過度依賴同一個狀態來源,導致耦合。
- **Dependency Injection (DI)**:以依賴注入方式提供物件,如 ViewModelFactory 或 Hilt。
- **Hilt ViewModel**:使用 Hilt 進行依賴注入的 ViewModel。
- **Screen-specific State**:僅在特定畫面中需要的狀態資料。
- **Feature Module**:應用中具備獨立功能的一個模組單位。
- **ViewModelFactory**:負責創建 ViewModel 實例的工廠類別。
- **Jetpack**:Google 提供的一系列 Android 開發元件集合。
- **Single Responsibility Principle**:每個類別或模組應僅負責一個功能。
- **Unidirectional Data Flow**:資料以單一方向流動,方便追蹤變化。
- **Backstack Management**:管理應用畫面堆疊行為的策略。
- **Memory Management**:有效使用與釋放裝置記憶體的技術。
- **Event Handling**:處理使用者互動或系統事件的流程。
- **Lifecycle Awareness**:根據元件生命週期管理資料或行為。
- **State Hoisting**:將狀態提升至父 Composable 元件,由上層管理狀態。
- **MutableState**:Compose 中可變的狀態類型,用於觸發重組。
- **Back Navigation**:支援使用者返回上一個畫面的行為。
- **Deep Link**:外部連結直接導向應用內特定畫面的功能。
- **Route Parameterization**:將路由參數化,使不同資料可以共用同一路由結構。
- **Type Safety**:保證資料型別正確,減少執行期錯誤。
- **Recomposition**:Compose 根據狀態變更重新渲染 UI。
- **Graph Scope**:限制 ViewModel 或其他元件的生命週期在特定導航圖內。
- **State Preservation**:保存應用狀態以應對不可預期終止或配置變更。
- **Composable Destination**:指定可組合目的地(畫面)的導航目標。
- **Stateful Dependency**:具有內部可變狀態的類別,常用來在應用中多處共享資料。
- **Singleton**:全應用共用的單一實例,生命週期與應用程式相同。
- **Dagger Hilt**:Android 用的依賴注入框架,簡化物件管理。
- **MutableStateFlow**:可以持續變化並能被觀察的資料流,支援即時更新 UI。
- **Global Counter**:一個應用中共用的計數器實例,通常為單例。
- **Injection**:將依賴物件自動提供給需要的類別或元件。
- **State Synchronization**:跨畫面保持資料一致性的技術。
- **Manual State Reset**:在需要時手動重設單例物件中的狀態資料。
- **Process Death Issue**:單例無法天然支援進程死亡後狀態恢復的問題。
- **Global State Danger**:過度依賴全域狀態導致難以維護與錯誤頻發。
- **Scoped Singleton**:將單例限定在特定範圍內,避免全域污染。
- **Authentication State**:表示使用者是否登入的狀態資料。
- **Navigation Graph Lifecycle**:透過導航圖控制狀態生命週期,確保適時清除。
- **Composition Local**:Compose 中提供資料給下層 Composables 的機制。
- **LocalContext**:取得目前組成上下文的 CompositionLocal。
- **LocalSnackbarHostState**:提供 Snackbar 控制狀態的 CompositionLocal。
- **CompositionLocalProvider**:提供 CompositionLocal 值的組合式函式。
- **SnackbarHost**:用來在應用中統一顯示提示訊息的元件。
- **Context Sharing**:在 Compose 中分享 Context 物件。
- **Preview Breakage**:由於 CompositionLocal 缺失導致的預覽失效。
- **Default Value for CompositionLocal**:設定 CompositionLocal 預設值,避免錯誤。
- **RememberNavController Issue**:因為是組合式函式,無法當作預設值使用。
- **Error Throwing CompositionLocal**:無法提供預設值時,拋出錯誤提醒。
- **Callback Usage**:以回呼函式取代直接傳遞大型狀態或控制器。
- **Persistent Storage**:將資料保存至裝置儲存空間,應對應用終止與重啟。
- **Session Cache**:用來保存登入使用者資訊的快取機制。
- **SharedPreferences**:Android 上簡單輕量的持久儲存方式。
- **Session Management**:管理使用者登入會話的策略。
- **JSON Serialization**:將物件轉換為 JSON 字串以便儲存或傳遞。
- **Moshi Library**:Android 上常用的 JSON 序列化與反序列化庫。
- **Process Death Persistence**:即使應用被系統終止,也能恢復資料。
- **Login State Sharing**:跨畫面共用使用者登入狀態。
- **Logout Handling**:在登出時清除所有相關資料的作法。
- **Global Logout Function**:統一管理登出行為的函式。
- **User Session Survival**:確保使用者會話在應用重啟後仍然存在。
- **Disk-backed Storage**:資料存儲於裝置硬碟,而非記憶體。
- **Navigation and Storage Integration**:導航與儲存整合應對狀態問題。
- **Data Access Object (DAO)**:數據存取物件,用於與資料庫或儲存層互動。
- **Token Expiration Management**:管理登入憑證過期的邏輯。
- **Cross-screen State Retrieval**:在不同畫面中取得共享資料。
- **Serialization Error Handling**:處理資料序列化失敗的錯誤。
- **State Consistency Assurance**:確保在各畫面間狀態一致。
- **Shared Storage Injection**:將持久儲存物件注入至 ViewModel 或其他類別。
- **Data Persistence Strategy**:根據應用需求設計資料保存策略。
- **Application-wide Session Access**:整個應用可存取的使用者會話資料。
- **Storage Layer Abstraction**:將儲存邏輯封裝於單獨類別,易於管理。
- **Disk I/O Considerations**:考量儲存與讀取資料對效能的影響。
- **Session Expiry Handling**:自動處理會話過期與重新登入流程。
- **SharedPreferences Key Management**:有組織地管理偏好設定中的 Key。
- **Error-prone Manual Management**:警惕因手動管理狀態導致的錯誤。
- **Robust State Sharing**:強健可靠的跨畫面資料共享方法。
- **Process Resilience**:設計能適應應用被系統中止的架構。