Что делать, когда зависимость, необходимая перед инъекцией рукоятиAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Что делать, когда зависимость, необходимая перед инъекцией рукояти

Сообщение Anonymous »

Настройка архитектуры < /h2>
У меня есть многомодульная архитектура с: < /p>
  • Настройка инъекции зависимости < /strong> (

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

    DataStoreModule
    ):

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

@Module
@InstallIn(SingletonComponent::class)
object DataStoreModule {
private const val PREFERENCES_NAME = "user.preferences"
private val Context.dataStore by preferencesDataStore(name = PREFERENCES_NAME)

@Singleton
@Provides
fun provideDataStore(@ApplicationContext context: Context): DataStore {
return context.dataStore
}
}
< /code>
[list]
[*]  Репозиторий с использованием di < /strong> (UserPreferencesRepositoryImpl
):
[/list]

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

@Singleton
class UserPreferencesRepositoryImpl @Inject constructor(
private val storageManager: StorageManager,
coroutineScope: CoroutineScope
) : UserPreferencesRepository {

override val languageCode: StateFlow =
storageManager.getString(StorageItem.LANGUAGE).map { savedLanguage ->
savedLanguage.ifEmpty { Locale.getDefault().language }
}.stateIn(...)

override suspend fun setLanguage(languageCode: String) {
storageManager.set(StorageItem.LANGUAGE, languageCode)
}
}
< /code>
[list]
[*]  Manager доступа < /strong> (strong> (LocaleManager
):
[/list]

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

@Singleton
class LocaleManager @Inject constructor(
private val userPreferencesRepository: UserPreferencesRepository
) {
// ... regular DI methods work fine ...

companion object {
private const val LANGUAGE_KEY = "data.store.prefsLANGUAGE"
private val Context.dataStore by preferencesDataStore("user.preferences") // ⚠️ PROBLEM HERE

/**
* Static method for early context wrapping without DI.
* Used in attachBaseContext before Hilt injection is available.
*/
fun wrapContextEarly(baseContext: Context): Context {
val language = getSavedLanguageEarly(baseContext)
return setLocaleStatic(baseContext, language)
}

private fun getSavedLanguageEarly(context: Context): String = runBlocking {
try {
context.dataStore.data.map { preferences ->
preferences[stringPreferencesKey(LANGUAGE_KEY)] ?: Locale.getDefault().language
}.first()
} catch (e: Exception) {
Locale.getDefault().language
}
}
}
}
< /code>
[list]
[*]  использование MANACTICTION@AndroidEntryPoint
class MainActivity : ComponentActivity() {
@Inject lateinit var localeManager: LocaleManager

// This is called BEFORE Hilt injection, so we need static access
override fun attachBaseContext(newBase: Context) {
super.attachBaseContext(LocaleManager.wrapContextEarly(newBase))
}
}
Конфликт
Проблема в том, что у меня есть два экземпляра данных [/b], пытаясь получить доступ к одному и тому же файлу:

Di Datastore : создан DataStoreRemodule для инклекса зависимости

: DataStore : создан PrecentionsDatastore делегировать в localemanager.wrapcontextearly ()
[/list]
Оба используют одно и то же имя файла. /> [*] Каков рекомендуемый подход для доступа к данному хранителю /> Есть ли способ создать односпособное хранилище данных , которое работает как с хильтом, так и с статическим доступом? /> ограничения < /h2>
  • необходимо управление локали в AttactBaseContext < /code> (до di) < /li>
    Хотите использовать DataStore для консистенции (не SharedPreferences) < /li>
    Использование для инъекции зависимости < /li>
    Архитектура < /li>
    < /ul>
    Что я попробовал < /h2>

    Использование различных имен файлов данных (работает, но создает изоляцию данных) < /li>
    Несколько экземпляров) < /li>
    < /ul>
    Любое руководство по вопросам передовой практики < /strong> для этой архитектуры было бы очень оценено! Предпочтения 1.1.7
  • Узел 2.56.2


Подробнее здесь: https://stackoverflow.com/questions/796 ... -injection
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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