Мне нужно получить доступ к моему экземпляру SharedPreferences в attachBaseContext моей деятельности (чтобы я мог установить там языковой стандарт), но внедренный экземпляр SharedPreferences там недоступен, поскольку инъекция происходит в методе onCreate, который выполняется после вызова attachBaseContext. Я использую dagger2 для внедрения зависимостей.
Есть идеи, как избежать создания нового экземпляра SharedPreferences?
Обновлено:
Хорошо, я думаю, проблема в том, что я слишком часто пытаюсь использовать кинжал, я думаю, что в данном случае он просто не подходит. В attachBaseContext каждого действия мне нужно обновить локаль, и я извлек эту логику обновления на LocaleManager, которому нужен доступ к экземпляру SharedPreferences и Context, который я получаю в attachBaseContext. Экземпляр SharedPreferences уже находится в AppModule, но я все еще не могу добавить его в действия до вызова @Inject, поскольку инъекции активности происходят после attachBaseContext.
Ага, другого решения придумать не могу, попробую, спасибо!
Привет, не могли бы вы помочь моему другу с той же проблемой, пожалуйста, проверьте ссылку один раз stackoverflow.com/q/53277662/3946958
Боролся с той самой проблемой. Как вы наконец ее решили?
В итоге я создал экземпляр SharedPreferences вручную, без кинжала @LeoDroidcoder
Да, здесь то же самое. Кажется, это единственный способ
Пока у вас есть доступ к Component, вы можете добавить метод обеспечения
@Singleton
@Component(modules = [AppModule::class])
interface AppComponent {
fun inject(myActivity: MyActivity)
fun sharedPreferences(): SharedPreferences
...
}
а затем получить доступ к вашему SharedPreferences напрямую через Component:
class MyActivity : AppCompatActivity() {
override fun attachBaseContext(newBase: Context) {
val sharedPreferences = component.sharedPreferences()
...
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
component.inject(this)
}
}
Спасибо за ответ! Я использую реализацию @ContributesAndroidInjector и поэтому не создаю никаких компонентов. ApplicationComponent - единственный, который у меня есть, поэтому это приведет к перемещению SharedPreferences на уровень приложения, но я собираюсь изучить это решение.
В этом случае вызов AndroidInjection.inject(this) создает компонент, (сгенерированный) MyActivitySubcomponent. Таким образом, определение активности вашего SharedPreferences не поможет вам «избежать новых экземпляров». И ответ выше, даже с упомянутым пакетом dagger.android, должен быть вариантом. Помимо рефакторинга вашей логики.
Привет, не могли бы вы помочь моему другу с той же проблемой, пожалуйста, проверьте ссылку один раз stackoverflow.com/q/53277662/3946958
Не будет работать, потому что сначала нужно вызвать инъекцию в onCreate, но attachBaseContext вызывается до onCreate, поэтому у вас будет NullPointer
Почему бы вам не попробовать запустить компоненты dagger2 в расширяющем класс Application? чем в Activity?