---
# System prepended metadata

title: '[Video Note]  Philipp Lackner - Firebase Google Sign-In With Jetpack Compose & Clean Architecture'
tags: [Authentication, Video Note, Firebase]

---

### 影片簡介  
- 本影片介紹如何在 Jetpack Compose 專案中整合 Google 登入，並遵循 Clean Architecture。  
- 透過簡單的按鈕登入，選擇 Google 帳戶後進入個人檔案畫面，顯示用戶資訊並提供登出功能。  
- 確保登入狀態持續存在，重新啟動 App 仍可自動導向個人檔案畫面。  

### 前置準備  
- 下載影片描述中的初始專案，以獲取必要的 Gradle 設定與依賴項目。  
- 主要使用 Firebase、Jetpack Compose Lifecycle、Compose Navigation（管理登入與個人檔案畫面）、Coil（載入遠端圖片）。  
- Kotlin 版本為 1.8.10，Compose 版本為 1.4.0。  

### Google 登入的實現方式  
- 可自行架設驗證伺服器處理 Google 登入請求與 Token 驗證（本專案不採用）。  
- 使用 Firebase 作為後端服務，簡化 Google 登入整合流程（本專案採用）。  

### 連接 Firebase  
- 在 Android Studio 開啟 `Tools` → `Firebase`，打開 Firebase 助理面板。  
- 在 Firebase 控制台新增專案（範例名稱：Google Sign In YouTube）。  
- 取消 Google Analytics 以簡化設置，然後建立專案。  
- 在 Firebase 助理選擇 `Authentication` → `Sign in with Google`，點擊 `Connect to Firebase`。  
- 確保 `google-services.json` 文件出現在 `project view` 中（避免上傳至 GitHub）。  

### 設定 SHA1 指紋  
- 在 Android Studio `Gradle` 面板，進入 `Tasks` → `Android` → `Signing Report`。  
- 執行 `Signing Report` 以獲取 SHA1 值。  
- 進入 Firebase 控制台，前往 `Project settings` → `SHA certificate fingerprints`。  
- 貼上 SHA1 指紋，點擊 `Save`。  

### 啟用 Google 登入驗證  
- 在 Firebase 控制台，進入 `Build` → `Authentication`，點擊 `Get Started`。  
- 在 `Sign-in method` 中選擇 `Google`，啟用該選項。  
- 設定 `支援信箱`（選擇 Firebase 帳戶的電子郵件）。  
- Firebase 會自動生成 `Web client ID`，稍後需在 Android 專案中使用。  
- 點擊 `Save` 以完成設定。  

### Firebase 設定完成  
- 現在 Firebase 端的設定已完成，接下來可以開始撰寫程式碼來實作 Google 登入功能。

### **專案結構規劃**  
- 採用 Clean Architecture，將 Google Sign-In 放入 Presentation 層，因為 Firebase SDK 既包含資料處理，也涉及 UI 互動。  
- 創建 `presentation` 資料夾，內部建立 `signin` 子資料夾，放置 `GoogleAuthUiClient` 負責登入、登出、取得使用者資訊。  

### **GoogleAuthUiClient 類別**  
- 需要 `Context` 和 `SignInClient`（Firebase 提供的 One Tap 客戶端）。  
- 內部保存 FirebaseAuth 物件，負責處理登入狀態。  

### **建立登入請求**  
- 建立 `private fun buildSignInRequest()` 回傳 `BeginSignInRequest` 物件。  
- 設定 `setGoogleIdTokenRequestOptions(true)` 讓 Google ID 登入可用。  
- 設定 `setFilterByAuthorizedAccounts(false)` 顯示所有 Google 帳戶。  
- 設定 `setServerClientId(context.getString(R.string.web_client_id))` 使用 Firebase 取得的 Web Client ID。  
- 設定 `setAutoSelectEnabled(true)` 若只有一個帳戶則自動選取。  

### **執行登入**  
- `suspend fun signIn()` 透過 `oneTapClient.beginSignIn(request).await()` 啟動登入流程。  
- 成功時回傳 IntentSender，讓 Activity 啟動 Google 登入畫面。  
- 使用 `try-catch` 捕捉異常，避免協程取消時影響流程。  

### **處理登入結果**  
- `suspend fun signInWithIntent(intent: Intent)` 透過 `oneTapClient.getSignInCredentialFromIntent(intent)` 取得憑證。  
- 建立 Google 認證資訊，然後透過 `auth.signInWithCredential(credentials).await()` 讓 Firebase 完成登入。  
- 取得 FirebaseUser 並轉換為 `UserData`，包含 `userId`、`username` 和 `profilePictureUrl`。  
- 回傳 `SignInResult(data, errorMessage)`。  

### **UserData 與 SignInResult**  
- `UserData` 包含 `userId` (Firebase UID)、`username` (可為 null)、`profilePictureUrl` (可為 null)。  
- `SignInResult` 包含 `data` (成功時為 `UserData`，否則為 null)、`errorMessage` (錯誤時的訊息)。  

### **登出功能**  
- `suspend fun signOut()` 執行 `oneTapClient.signOut().await()` 和 `auth.signOut()`，讓使用者必須重新登入。  

### **取得目前登入使用者**  
- `fun getSignedInUser(): UserData?` 讀取 `auth.currentUser`，轉換為 `UserData`，若無登入則回傳 null。  

### **登入狀態管理**  
- `SignInState` 包含 `isSignInSuccessful` (是否成功登入，預設 `false`)、`signInErrorMessage` (錯誤訊息，可為 null)。  
- 透過 `SignInState` 監聽登入狀態，決定 UI 變更。  

### **ViewModel 設計**
- `SignInViewModel` 使用 `StateFlow` 來管理登入狀態。
- `state` 為可變的 `MutableStateFlow`，對外提供不可變版本。
- `onSignInResult` 函數會在登入後更新狀態。
- 根據登入結果，若有 `UserData` 則設 `isSignInSuccessful` 為 `true`，並更新錯誤訊息。
- 提供 `resetState` 函數來重置狀態，將 `isSignInSuccessful` 設為 `false`，清除錯誤訊息。

### **SignInScreen 設計**
- 使用 `Box` 和 `Button` 布局，按鈕顯示「Sign In」。
- 透過 `onSignInClick` Lambda 來處理按鈕點擊事件。
- 顯示錯誤訊息時，透過 `Toast` 提示用戶。
- 使用 `LocalContext.current` 來獲取 `context`，並在錯誤狀態變化時顯示 `Toast`。

### **UI 更新與錯誤處理**
- 當登入錯誤時，使用 `LaunchedEffect` 監控 `state.signInError`，並顯示錯誤提示。
- 設計簡單的 UI，包含填滿螢幕的 `Box` 和居中的登入按鈕。

### **MainActivity 設計與導航**
- 使用 `NavController` 設定頁面導航，起始頁面為登入頁面。
- 使用 `rememberLauncherForActivityResult` 來處理 `IntentSender`，並接收登入結果。
- 根據登入結果更新 `SignInViewModel` 的狀態。

### **IntentSender 處理**
- 在 `onSignInClick` 中觸發 `signInIntentSender`，並將 `IntentSender` 交給 `launcher` 執行。
- 如果登入成功，呼叫 `onSignInResult` 更新登入結果。
- 使用 `ActivityResultContracts.StartIntentSenderForResult` 來處理結果。

### **錯誤與崩潰處理**
- 初始 Firebase 設定錯誤，未初始化 Firebase 預設應用。
- 需要在 `build.gradle` 中添加 Firebase 插件配置，解決崩潰問題。

### **ProfileScreen 設計**
- 不需要 ViewModel，因為只顯示靜態用戶資料。
- 顯示用戶的個人資料，包含頭像、用戶名和登出按鈕。
- 使用 `AsyncImage` 顯示用戶頭像，並進行圓形裁剪。
- 顯示用戶名，設置居中對齊和加粗字型。
- 當點擊登出按鈕時，執行登出操作。

### **MainActivity 設計**
- 在 `MainActivity` 中註冊 Profile 頁面，並將用戶資料傳遞給 ProfileScreen。
- 通過 `GoogleAuthUIClient` 獲取已登入用戶資料，並傳遞給 ProfileScreen。
- 註冊登出操作，點擊登出後會調用 `GoogleAuthUIClient.signOut`，並顯示登出提示。
- 使用 `NavController` 進行頁面導航，登出後返回登入頁面。

### **ProfileScreen 參數處理**
- 讓 `userData` 參數可為 nullable，並在 ProfileScreen 中加入 null 檢查。
- 傳遞 `userData` 物件，確保即使用戶資料為 null 也能正常處理。

### **自動導航至 ProfileScreen**
- 當應用啟動並且用戶已登入時，直接導航至 ProfileScreen。
- 使用 `LaunchedEffect` 檢查是否已登入，若已登入則直接導航至 ProfileScreen。

### **Sign In 及登出邏輯**
- 登入成功後顯示 toast 並導航至 ProfileScreen。
- 登出後重置狀態，並返回登入頁面。
- 若再次啟動應用，檢查用戶是否已登入，若已登入則自動導航至 ProfileScreen。

# Terminology
- **Jetpack Compose**：Android 的現代 UI 工具，使用聲明式方式構建 UI  
- **Google Sign-In**：允許用戶使用 Google 帳戶進行身份驗證的登入方式  
- **Clean Architecture**：一種軟體設計模式，將程式碼分層以提高可維護性與測試性  
- **Firebase**：Google 提供的後端服務平台，支援身份驗證、數據存儲等功能  
- **Authentication**：身份驗證，確保用戶身份的真實性  
- **Firebase Console**：Firebase 的網頁管理平台，可用於配置專案  
- **Gradle**：Android 專案的構建工具，用於管理依賴與編譯配置  
- **dependencies**：依賴項，專案所需的外部庫或模組  
- **SHA-1 Fingerprint**：應用的數位簽章，用於識別應用程式  
- **Google Services JSON**：Google 服務配置文件，包含 Firebase 專案資訊  
- **Android Studio**：Google 官方的 Android 應用開發環境  
- **Dagger Hilt**：Google 推出的依賴注入框架，簡化依賴管理  
- **Navigation Component**：Jetpack 提供的導航管理工具，可處理多頁面應用的導航  
- **Coil**：Kotlin 版的圖片加載庫，優化圖片處理與顯示  
- **ViewModel**：Android 架構元件之一，用於管理 UI 相關的數據  
- **LiveData**：可觀察數據容器，確保 UI 在數據變更時自動更新  
- **MutableState**：Jetpack Compose 中的可變狀態變數  
- **Sign-In Button**：提供 Google 登入的按鈕，觸發身份驗證流程  
- **Profile Screen**：登入成功後顯示用戶資訊的畫面  
- **Sign-Out Button**：登出按鈕，允許用戶退出帳戶  
- **Reauthentication**：重新驗證，確保用戶仍具備訪問權限  
- **Token**：身份驗證的憑證，用於驗證請求合法性  
- **OAuth 2.0**：身份驗證協議，支援第三方應用登入  
- **Client ID**：應用的唯一識別碼，用於驗證 Google Sign-In 請求  
- **Web SDK Configuration**：用於 Web 端的 Firebase 設定  
- **Firebase Authentication API**：Firebase 提供的身份驗證 API  
- **Google Play Services**：Google 提供的服務框架，支援多種應用功能  
- **Intent**：Android 中用於啟動活動（Activity）的機制  
- **Activity Result API**：用於處理活動結果的新式 API  
- **Coroutine**：Kotlin 提供的協程，用於處理非同步操作  
- **suspend function**：Kotlin 中的掛起函式，用於協程內部執行  
- **State Management**：狀態管理，確保 UI 與數據同步更新  
- **Compose Lifecycle**：Jetpack Compose 中的生命週期管理工具  
- **Firebase Assistant**：Android Studio 內建的 Firebase 配置工具  
- **User Account Selection**：用戶選擇 Google 帳戶進行登入的介面  
- **Persistent Login**：保持登入狀態，即使應用重啟也無需重新登入  
- **GoogleSignInClient**：Google 登入的 API 客戶端，用於處理登入流程  
- **GSON**：JSON 處理庫，用於解析與轉換數據  
- **SharedPreferences**：Android 提供的輕量級本地存儲工具  
- **EncryptedSharedPreferences**：加密版 SharedPreferences，提升安全性  
- **FirebaseUser**：Firebase 中的用戶對象，包含用戶資訊  
- **onActivityResult**：處理活動結果的回調函式（舊版 API）  
- **LauncherForActivityResult**：新的 API，處理活動結果更簡潔  
- **GoogleApiAvailability**：檢查 Google 服務可用性的工具類  
- **Authentication Token Refresh**：身份驗證令牌的更新機制  
- **Security Rules**：Firebase 提供的安全規則，用於保護數據  
- **Firebase Database**：Firebase 的雲端數據庫，可存儲應用數據  
- **Error Handling**：錯誤處理，確保應用在異常情況下穩定運行  
- **Logging**：記錄應用執行過程中的資訊，方便調試與監控  
- **Network Connectivity Check**：檢測網絡連接狀態，避免登錄失敗  
- **UI Testing**：用於測試應用的界面交互，確保功能正常運行  
- **Unit Testing**：測試單一功能模組，確保其邏輯正確
- **Gradle**：一種用於構建Android應用的自動化工具，負責管理依賴項與構建流程。  
- **Android View**：Android Studio 中的視圖模式，用於顯示應用的文件結構。  
- **Clean Architecture**：一種軟體架構模式，將應用劃分為不同層級，以保持高內聚、低耦合。  
- **Firebase SDK**：Google 提供的開發工具包，支援身份驗證、數據存儲等功能。  
- **Intent Sender**：Android 中用於觸發特定操作（如啟動 Activity）的機制。  
- **Activity for Result**：允許從一個 Activity 啟動另一個 Activity 並獲取返回結果的機制。  
- **Presentation Layer**：應用的 UI 相關層，負責處理使用者介面邏輯。  
- **GoogleAuthUIClient**：負責處理 Google 身份驗證的類別。  
- **Context**：Android 應用的環境資訊，可用於獲取資源、啟動 Activity 等。  
- **OneTapClient**：Firebase 提供的 API，用於管理 One Tap Google 登入。  
- **FirebaseAuth**：Firebase 身份驗證服務的核心類別，負責用戶管理。  
- **Coroutine**：Kotlin 的協程機制，用於處理非同步任務。  
- **Suspend Function**：Kotlin 中的掛起函式，可在協程內部執行並暫停執行。  
- **BeginSignInRequest**：One Tap 登入請求的配置類別，負責設置登入參數。  
- **Builder Pattern**：一種設計模式，允許通過鏈式調用構建複雜對象。  
- **GoogleIdTokenRequestOptions**：Google ID 令牌的請求選項。  
- **Set Filter by Authorized Accounts**：設定是否只顯示已登入過的帳戶。  
- **Server Client ID**：用於驗證 Google 登入請求的唯一標識符。  
- **Strings.xml**：Android 應用的資源文件，用於存儲文字字串。  
- **PendingIntent**：Android 的延遲意圖，允許其他應用在未來執行特定動作。  
- **Task API**：Firebase SDK 的非同步操作機制，允許監聽操作結果。  
- **OnSuccessListener**：當 Firebase 操作成功時的回調函式。  
- **OnFailureListener**：當 Firebase 操作失敗時的回調函式。  
- **Await()**：將 Firebase 的 Task 轉換為 Kotlin 協程的可掛起函式。  
- **CancellationException**：協程取消時拋出的異常，用於確保正確取消流程。  
- **SignInResult**：封裝 Google 登入結果的數據類別。  
- **UserData**：封裝使用者基本資訊（如 UID、名稱、頭像）的類別。  
- **FirebaseUser**：Firebase 身份驗證返回的用戶對象。  
- **SignInCredential**：代表 Google 登入憑據的物件。  
- **GoogleAuthProvider**：Firebase 提供的 Google 驗證機制。  
- **SignInWithCredential**：Firebase 方法，使用登入憑據執行身份驗證。  
- **DisplayName**：Google 帳戶的顯示名稱。  
- **PhotoUrl**：Google 帳戶的個人頭像網址。  
- **SignOut()**：登出目前登入的 Firebase 使用者。  
- **GetCurrentUser()**：取得目前登入的使用者資訊。  
- **Run{}**：Kotlin 擴展函式，用於簡化對象操作。  
- **Try-Catch Block**：用於處理例外（Exception）的程式碼結構。  
- **PrintStackTrace()**：列印錯誤堆疊資訊，幫助除錯。  
- **Nullable**：Kotlin 的可空性概念，允許變數存儲 null 值。  
- **ErrorMessage**：錯誤訊息變數，用於存儲失敗原因。  
- **SignInState**：封裝登入狀態的類別，包含成功與錯誤資訊。  
- **Boolean Flag**：用於標示特定狀態的布林變數。  
- **Navigate to Next Screen**：當登入成功後導航到新的畫面。  
- **LiveData**：Android 架構元件之一，用於監聽資料變化。  
- **MutableState**：Jetpack Compose 提供的可變狀態，允許 UI 重新繪製。  
- **ViewModel**：Android 架構元件，負責 UI 資料的管理與存活。  
- **Compose Button**：Jetpack Compose 的按鈕元件，支援 UI 組合。  
- **LaunchedEffect**：Jetpack Compose 提供的副作用機制，適用於啟動協程。  
- **Scaffold**：Compose 提供的基本佈局結構，用於構建 UI。  
- **Modifier**：Compose 提供的修飾符，用於改變 UI 元件的屬性。  
- **Column**：Compose 內的佈局元件，讓子組件垂直排列。  
- **Padding**：設定 UI 元件的內邊距，以增加間距與可讀性。  
- **Click Listener**：當按鈕被點擊時執行的動作。  
- **State Hoisting**：Jetpack Compose 的狀態提升模式，確保 UI 可組合性。  
- **GoogleSignInButton**：Google 官方提供的登入按鈕組件。  
- **SignInResponse**：封裝登入操作結果的物件，用於回應 UI。
- **ViewModel**：在MVVM架構中，負責處理與UI無關的業務邏輯和數據管理，並與UI層進行交互。
- **MutableStateFlow**：Kotlin中的可變狀態流，允許在應用中維護並觀察可變狀態。
- **StateFlow**：一種Kotlin的流，專門用來表示不可變的UI狀態，與MutableStateFlow一起使用。
- **Composables**：Compose中構建UI的基本單位，代表可重用的UI組件。
- **Lambda**：Kotlin中的匿名函數，可以作為參數傳遞，並在需要時執行特定操作。
- **ActivityResultLauncher**：用來啟動並處理活動結果的接口，與`startActivityForResult`方法相似。
- **IntentSender**：一個可以啟動Intent的對象，通常用於啟動外部應用或Activity並等待結果。
- **OneTapClient**：Firebase提供的一個用戶身份驗證API，用來簡化Google登入的流程。
- **Firebase Auth**：Firebase提供的身份驗證服務，用於處理用戶登錄和認證。
- **Suspending Function**：Kotlin中的掛起函數，允許在協程中進行非同步操作並阻塞當前執行線程。
- **Coroutine**：Kotlin的協程，用於處理異步操作，能夠保持輕量並且高效。
- **NavController**：Compose Navigation中的控制器，負責在多個屏幕之間導航。
- **NavHost**：在Compose中負責管理和顯示多個導航目的地的容器。
- **ActivityResultContracts**：提供不同類型的活動結果契約，用來啟動不同的活動並處理結果。
- **LifecycleScope**：用於協程啟動和取消的範圍，與Activity或Fragment的生命周期相關聯。
- **SignInResult**：登錄結果的數據類，包含用戶數據和錯誤訊息。
- **Task**：代表一個異步操作的結果，Firebase SDK中常用來表示操作的狀態。
- **Intent**：用於啟動Activity或傳遞數據的消息對象，在Android中非常常見。
- **ViewModelProvider**：用於創建並提供ViewModel實例的工具，通常與Activity或Fragment的生命周期相關聯。
- **FirebaseUser**：Firebase中用來表示經過身份驗證的用戶對象，包含用戶的基本信息。
- **CoroutineScope**：協程的範圍，用來管理協程的生命週期。
- **GoogleAuthProvider**：用來處理Google登錄的Firebase身份驗證提供者。
- **GoogleIdToken**：在使用Google登錄時，Google返回的一個身份驗證令牌。
- **UI State**：應用的用戶界面狀態，用來驅動UI的更新。
- **MutableLiveData**：LiveData的一種，允許在ViewModel中修改並通知觀察者。
- **LiveData**：一種可觀察的數據持有者，用於UI和數據層的解耦。
- **Context**：Android中的上下文對象，提供應用環境的訪問，如資源、系統服務等。
- **getResult**：用來獲取異步操作結果的函數。
- **Error Handling**：處理錯誤和異常的技術，確保程序能夠優雅地應對問題。
- **Toast**：在Android中顯示簡短訊息的UI元素。
- **OnClickListener**：用於處理UI元件（如按鈕）的點擊事件。
- **String Resources**：在Android應用中定義和管理字符串的資源文件。
- **Autofill**：自動填充表單信息的功能，通常與登錄表單一起使用。
- **ServerClientId**：用於Google登錄的Web端客戶端ID，從Firebase控制台中獲得。
- **GoogleCredential**：包含Google認證信息的對象，通常用來進行身份驗證。
- **BeginSignInRequest**：Firebase身份驗證流程中的請求對象，用來初始化登錄請求。
- **SignInRequestBuilder**：用於構建登錄請求的構建器模式。
- **UserData**：表示登錄用戶數據的對象，包含用戶ID、名稱和頭像URL等信息。
- **GoogleAccount**：在Android設備上註冊的Google帳戶，用於登錄。
- **SignOut**：用戶登出操作，從系統中登出當前用戶。
- **AuthResult**：表示身份驗證結果的對象，通常包含登錄後的用戶資料。
- **LoginFlow**：用戶登錄流程，包含從選擇登錄方式到最終完成登錄的過程。
- **PendingIntent**：可以在未來某個時間點執行的Intent，通常用於延遲處理某些操作。
- **WebClientId**：Firebase用來識別Web應用的客戶端ID，用於身份驗證。
- **SignedInUser**：成功登錄的用戶，通常包含詳細的用戶信息。
- **State Management**：在應用中管理UI狀態的技術，常見於MVVM架構中。
- **Authorization Flow**：身份驗證過程，涉及用戶授權和安全驗證的步驟。
- **Profile Screen**：顯示用戶個人資料的界面，通常在登錄後展示。
- **MutableLiveData**：LiveData的一種，能夠在內部修改其值並通知觀察者。
- **GoogleSignInClient**：Firebase SDK中的一個客戶端，用來處理Google登錄操作。
- **ActivityResult**：用來表示從活動返回的結果的數據對象。
- **ResultCode**：代表活動返回結果的狀態碼，常見的有`RESULT_OK`、`RESULT_CANCELED`等。
- **OnActivityResult**：舊版API中的方法，用於處理活動結果。
- **SignInWithIntent**：從已啟動的意圖中獲取登錄結果並進行處理的功能。
- **AuthCredential**：用來執行身份驗證操作的證書對象，通常由外部服務（如Google）提供。
- **CredentialProvider**：用來提供身份驗證所需憑證的接口。
- **CoroutineCancellationException**：協程取消時拋出的異常，表示協程被中止。
- **SignInRequest**：用來初始化Google登錄流程的請求對象。
- **Profile Screen**：顯示用戶個人資料的介面，通常包括用戶名、頭像等基本資訊。
- **Composables**：Compose中的可重用UI組件。
- **Column**：Compose中的佈局組件，用來垂直排列子項。
- **Modifier**：Compose中用來修飾或改變組件屬性（如大小、對齊、間距等）的對象。
- **Center**：用來將UI元素置中顯示的屬性。
- **AsyncImage**：使用Coil加載並顯示圖片的Compose組件，支持異步加載圖片。
- **Coil**：一個Android的圖片加載庫，用來高效處理圖像下載與顯示。
- **ContentScale**：定義圖片顯示方式的屬性，如裁剪、填充等。
- **ClipToShape**：將UI元素裁剪成特定形狀的屬性，例如圓形或矩形。
- **Spacer**：在Compose中插入空白間距的組件。
- **Text**：用來顯示文本的組件。
- **TextAlign**：設定文本對齊方式的屬性。
- **FontSize**：文本字體大小的屬性。
- **FontWeight**：文本字體重量（粗細）的屬性。
- **Sign Out**：登出操作，讓用戶退出當前賬戶。
- **Toast**：顯示短時間內的提示訊息的UI組件。
- **Lambda**：Kotlin中的匿名函數，可以作為參數傳遞。
- **Navigation**：在多個螢幕之間進行導航的技術。
- **NavController**：Compose中的導航控制器，用來管理屏幕之間的跳轉。
- **NavHost**：Compose中的導航容器，負責顯示不同的目標頁面。
- **LifecycleScope**：與生命周期關聯的協程範圍，用來啟動協程並在生命周期結束時取消。
- **User Data**：表示用戶資料的對象，通常包括用戶名稱、電子郵件和頭像等信息。
- **Profile Picture**：用戶的頭像圖片。
- **Google Auth UI Client**：Firebase用於處理Google登入的API客戶端。
- **SignInResult**：用戶登錄結果對象，包含登錄是否成功和相關的用戶數據。
- **getSignedInUser**：Firebase用來獲取當前已登錄用戶的方法。
- **GoogleSignInAccount**：Google登錄後的用戶帳戶對象，包含用戶的詳細信息。
- **ProfileScreen**：顯示用戶詳細資料的界面，通常包含用戶的名字、照片和其他基本資訊。
- **Reset State**：重置界面狀態，通常在登出時使用，確保用戶登錄狀態被清除。
- **SignOut Lambda**：在點擊登出按鈕時執行的Lambda函數，用來處理登出操作。
- **NavController.popBackStack()**：用來返回到前一個屏幕的導航方法。
- **Nullable Type**：允許變數為空（null）的類型，通常用於處理可選的數據。
- **Null Check**：檢查變數是否為null的操作，防止程式錯誤。
- **LaunchEffect**：Compose中用來在特定狀態變化時執行副作用的組件。
- **Activity Result**：從Activity返回的結果，通常用來處理活動之間的數據交互。
- **Intent**：Android中的一種用於啟動Activity或Service的對象。
- **IntentSender**：一個可以啟動Intent的對象，通常用於發送外部活動或登錄請求。
- **Google Sign-In**：Google提供的身份驗證API，讓用戶通過Google帳戶登錄。
- **FirebaseAuth**：Firebase的身份驗證服務，用來管理用戶登錄和登出。
- **AuthResult**：身份驗證結果的數據對象，通常包含用戶資料和認證狀態。
- **FirebaseUser**：Firebase的用戶對象，表示成功登入的用戶。
- **SignInWithIntent**：使用意圖進行登錄的功能，通常用於Google登錄。
- **ActivityResultContracts.StartIntentSenderForResult**：用來啟動Intent並獲取結果的契約。
- **ViewModel**：在MVVM架構中，負責處理UI邏輯和數據的對象。
- **Composable Function**：Compose中用來構建UI的函數，返回組件或元素。
- **NavGraph**：導航圖，用來定義不同的導航路徑和目的地。
- **GoogleIdToken**：Google登錄成功後返回的身份驗證令牌。
- **LiveData**：可以被觀察的數據類型，當數據變更時通知觀察者。
- **FirebaseCredential**：身份驗證過程中使用的憑證類型。
- **AuthCredential**：用來表示用戶身份驗證憑證的對象。
- **ActivityResultContracts.StartActivityForResult**：舊版Android中啟動活動並返回結果的契約。
- **LifecycleObserver**：生命週期觀察者，用來監聽和處理生命周期狀態變化。
- **GoogleSignInOptions**：設置Google登錄選項的對象，配置登錄流程的選項。
- **GoogleSignInClient**：Google登錄API的客戶端，用來處理登錄操作。
- **Profile Screen Navigation**：在導航過程中轉到用戶資料頁面的操作。