Использование объектов, внедренных кинжалом, в attachBaseContext

Мне нужно получить доступ к моему экземпляру SharedPreferences в attachBaseContext моей деятельности (чтобы я мог установить там языковой стандарт), но внедренный экземпляр SharedPreferences там недоступен, поскольку инъекция происходит в методе onCreate, который выполняется после вызова attachBaseContext. Я использую dagger2 для внедрения зависимостей.

Есть идеи, как избежать создания нового экземпляра SharedPreferences?

Обновлено:

Хорошо, я думаю, проблема в том, что я слишком часто пытаюсь использовать кинжал, я думаю, что в данном случае он просто не подходит. В attachBaseContext каждого действия мне нужно обновить локаль, и я извлек эту логику обновления на LocaleManager, которому нужен доступ к экземпляру SharedPreferences и Context, который я получаю в attachBaseContext. Экземпляр SharedPreferences уже находится в AppModule, но я все еще не могу добавить его в действия до вызова @Inject, поскольку инъекции активности происходят после attachBaseContext.

Почему бы вам не попробовать запустить компоненты dagger2 в расширяющем класс Application? чем в Activity?

Sreehari 08.06.2018 12:45

Ага, другого решения придумать не могу, попробую, спасибо!

Analizer 19.06.2018 13:54

Привет, не могли бы вы помочь моему другу с той же проблемой, пожалуйста, проверьте ссылку один раз stackoverflow.com/q/53277662/3946958

Ravindra Kushwaha 14.11.2018 07:54

Боролся с той самой проблемой. Как вы наконец ее решили?

Leo Droidcoder 19.12.2020 21:51

В итоге я создал экземпляр SharedPreferences вручную, без кинжала @LeoDroidcoder

Analizer 21.12.2020 12:55

Да, здесь то же самое. Кажется, это единственный способ

Leo Droidcoder 22.12.2020 19:47
9
6
1 112
1

Ответы 1

Пока у вас есть доступ к 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 на уровень приложения, но я собираюсь изучить это решение.

Analizer 19.06.2018 13:53

В этом случае вызов AndroidInjection.inject(this) создает компонент, (сгенерированный) MyActivitySubcomponent. Таким образом, определение активности вашего SharedPreferences не поможет вам «избежать новых экземпляров». И ответ выше, даже с упомянутым пакетом dagger.android, должен быть вариантом. Помимо рефакторинга вашей логики.

laenger 27.06.2018 19:14

Привет, не могли бы вы помочь моему другу с той же проблемой, пожалуйста, проверьте ссылку один раз stackoverflow.com/q/53277662/3946958

Ravindra Kushwaha 14.11.2018 07:54

Не будет работать, потому что сначала нужно вызвать инъекцию в onCreate, но attachBaseContext вызывается до onCreate, поэтому у вас будет NullPointer

Valentin Yuryev 28.11.2018 23:30

Другие вопросы по теме