Все строится нормально, пока я не раскомментирую функцию ObservePreferences() внутри ViewModel, где я собираю поток.
Когда я это делаю, я получаю эту ошибку времени выполнения:
Код: Выделить всё
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/sergiogv/notaku/data/di/PreferencesModule_ProvidePreferencesDataStoreFactory;
at com.sergiogv.notaku.DaggerNotakuApplication_HiltComponents_SingletonC$SingletonCImpl$SwitchingProvider.get(DaggerNotakuApplication_HiltComponents_SingletonC.java:824)
Код: Выделить всё
private const val USER_PREFERENCES = "user_preferences"
@Module
@InstallIn(SingletonComponent::class)
object LocalModule {
@Provides
@Singleton
fun providePreferencesDataStore(@ApplicationContext context: Context): DataStore
{
return PreferenceDataStoreFactory.create(
produceFile = { context.dataStoreFile(USER_PREFERENCES) }
)
}
@Provides
@Singleton
fun providePreferencesDataSource(dataStore: DataStore): PreferencesDataSource =
PreferencesDataSource(dataStore)
@Provides
@Singleton
fun providePreferencesRepository(dataSource: PreferencesDataSource): PreferencesRepository =
PreferencesRepositoryImpl(dataSource)
}
Код: Выделить всё
class PreferencesDataSource @Inject constructor(
private val dataStore: DataStore
) {
private companion object {
val THEME_KEY = stringPreferencesKey("theme_option")
val LANGUAGE_KEY = stringPreferencesKey("language_option")
val NOTIFICATION_TIME_KEY = intPreferencesKey("notification_time")
}
val userPreferencesFlow: Flow = dataStore.data.map { prefs ->
val theme = ThemeOption.valueOf(prefs[THEME_KEY] ?: ThemeOption.SYSTEM.name)
val lang = LanguageOption.valueOf(prefs[LANGUAGE_KEY] ?: LanguageOption.SPANISH.name)
val notifTime = prefs[NOTIFICATION_TIME_KEY] ?: 30
UserPreferences(theme, lang, notifTime)
}
suspend fun updateTheme(theme: ThemeOption) {
dataStore.edit { it[THEME_KEY] = theme.name }
}
suspend fun updateLanguage(language: LanguageOption) {
dataStore.edit { it[LANGUAGE_KEY] = language.name }
}
suspend fun updateNotificationTime(minutes: Int) {
dataStore.edit { it[NOTIFICATION_TIME_KEY] = minutes }
}
}
Код: Выделить всё
class PreferencesRepositoryImpl @Inject constructor(
private val dataSource: PreferencesDataSource
) : PreferencesRepository {
override fun getUserPreferences(): Flow = dataSource.userPreferencesFlow
override suspend fun updateTheme(theme: ThemeOption) {
dataSource.updateTheme(theme)
}
override suspend fun updateLanguage(language: LanguageOption) {
dataSource.updateLanguage(language)
}
override suspend fun updateNotificationTime(minutes: Int) {
dataSource.updateNotificationTime(minutes)
}
}
Код: Выделить всё
interface PreferencesRepository {
fun getUserPreferences(): Flow
suspend fun updateTheme(theme: ThemeOption)
suspend fun updateLanguage(language: LanguageOption)
suspend fun updateNotificationTime(minutes: Int)
}
Код: Выделить всё
class GetUserPreferencesUseCase @Inject constructor(
private val repository: PreferencesRepository
) {
fun execute(): Flow {
return repository.getUserPreferences()
}
}
Код: Выделить всё
@HiltViewModel
class ProfileViewModel @Inject constructor(
private val getUserPreferencesUseCase: GetUserPreferencesUseCase,
) : ViewModel() {
private val _userPreferences = MutableStateFlow(UserPreferences())
val userPreferences = _userPreferences.asStateFlow()
init {
observePreferences()
}
private fun observePreferences() {
viewModelScope.launch {
getUserPreferencesUseCase.execute().collect { prefs ->
_userPreferences.value = prefs
}
}
}
}
Код: Выделить всё
# Main project versions
agp = "8.13.0"
kotlin = "2.2.20"
ksp = "2.2.20-2.0.3"
# Hilt / Dagger
dagger = "2.57.2"
hilt = "1.3.0"
# DataStore
androidx.datastore:datastore-preferences:1.1.7
Подробнее здесь: https://stackoverflow.com/questions/797 ... ry-when-in
Мобильная версия