dark mode-v19

This commit is contained in:
Eric85710 2026-04-25 16:13:07 +08:00
parent e9125fc46f
commit 32c4c35f76
2 changed files with 63 additions and 10 deletions

View file

@ -0,0 +1,31 @@
package com.example.login_v3.data.di
import android.content.Context
import androidx.datastore.core.DataStore
// 修正 1: 確保匯入的是 androidx 的 Preferences
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.preferencesDataStore
import com.example.login_v3.data.local.UserPreferences.UserPreferencesRepository
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
// 定義擴充屬性,這裡保持為檔案私有 (private) 是沒問題的
private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "user_prefs")
@Module
@InstallIn(SingletonComponent::class)
// 修正 2: 移除 private,讓 Hilt 可以訪問這個模組
object DataStoreModule {
@Provides
@Singleton
fun provideUserPreferencesRepository(
@ApplicationContext context: Context
): UserPreferencesRepository {
return UserPreferencesRepository(context.dataStore)
}
}

View file

@ -1,21 +1,43 @@
package com.example.login_v3.home.setting.setting_detail_page.viewmodel package com.example.login_v3.home.setting.setting_detail_page.viewmodel
import android.util.Log import android.util.Log
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.example.login_v3.data.local.UserPreferences.UserPreferencesRepository
import com.example.login_v3.ui.theme.AppTheme import com.example.login_v3.ui.theme.AppTheme
import kotlinx.coroutines.flow.MutableStateFlow import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch
import javax.inject.Inject
class Theme_ViewModel : ViewModel() { @HiltViewModel // 1. 加上 Hilt 註解
private val _currentTheme = MutableStateFlow(AppTheme.DARK) class Theme_ViewModel @Inject constructor(
val currentTheme: StateFlow<AppTheme> = _currentTheme.asStateFlow() private val repository: UserPreferencesRepository // 2. 注入 Repository
) : ViewModel() {
// 3. 讀取:將 repository 的 Flow 映射為 AppTheme,並轉為 StateFlow
val currentTheme: StateFlow<AppTheme> = repository.themeModeFlow
.map { themeName ->
try {
AppTheme.valueOf(themeName.uppercase()) // 假設 AppTheme 是 Enum
} catch (e: Exception) {
AppTheme.DARK // 轉換失敗時的預設值
}
}
.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5000),
initialValue = AppTheme.DARK // 初始值
)
// 4. 更新:除了更新狀態,還要存入 DataStore
fun updateTheme(newTheme: AppTheme) { fun updateTheme(newTheme: AppTheme) {
Log.d("ThemeDebug", "ViewModel 更新主題為: $newTheme") Log.d("ThemeDebug", "ViewModel 更新主題並儲存至 DataStore: $newTheme")
_currentTheme.value = newTheme viewModelScope.launch {
repository.saveThemeMode(newTheme.name) // 儲存 Enum 的名稱 (例如 "DARK")
}
} }
} }