### 影片簡介 - 本影片介紹在 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**:設計能適應應用被系統中止的架構。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up