Hilt не генерирует PreferencesModule_ProvidePreferencesDataStoreFactory при внедрении DataStore (NoClassDefFoundError)Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Hilt не генерирует PreferencesModule_ProvidePreferencesDataStoreFactory при внедрении DataStore (NoClassDefFoundError)

Сообщение Anonymous »

Я пытаюсь внедрить экземпляр DataStore с помощью Hilt в свой проект Android.
Все строится нормально, пока я не раскомментирую функцию 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)
Похоже, что Hilt не генерирует класс PreferencesModule_ProvidePreferencesDataStoreFactory, но происходит сбой только тогда, когда ViewModel действительно использует вариант использования (когда вызывается getUserPreferencesUseCase()).

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»