Использование вставленных кинжалом объектов в attachBaseContext - PullRequest
0 голосов
/ 06 июня 2018

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

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

РЕДАКТИРОВАТЬ:

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

1 Ответ

0 голосов
/ 12 июня 2018

Пока вы можете получить доступ к вашему 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)
    }

}
...