Dagger 2 / Inject Context в классе неактивности - PullRequest
0 голосов
/ 25 февраля 2020

Буду признателен за помощь в решении следующей проблемы; Я проводил исследования в течение достаточно долгого времени, но, к сожалению, я не смог найти то, что действительно могло бы мне помочь.

Моя цель - внедрить applicationContext в класс, который не является Activity, Fragment или BroadcastReceiver.

Следуя руководству по codelab от Google, код, который у меня есть, следующий:

AppComponent.kt

@Singleton
@Component
interface AppComponent {

    @Component.Factory
    interface Factory {

        fun create(@BindsInstance context: Context): AppComponent
    }

    fun inject(activity: SplashActivity)
    fun injectToRep(dependantClass: FirstRep)
}

Теперь я могу добавить контекст к действию, вызвав следующее в методе onCreate () соответствующего действия. Это прекрасно работает.

SplashActivity.kt

...
(application as App).appComponent.inject(this)
...

Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь внедрить контекст в неактивный класс, например, в FirstRep class

FirstRep.kt

@SuppressLint("LogNotTimber")
class FirstRep{

    var context: Context? = null
        @Inject set

    fun logContext(mContext: Context? = context){
        Log.i("FirstRepo", "Context is: $mContext")
    }
}

Теперь, когда вызывается функция класса FirstRep, контекст равен нулю. Я предполагаю, что это ожидается. Я знаю, что пропускаю этап, на котором фактически происходит инъекция, но я не могу понять, как на самом деле реализовать это. Я читал, что для классов без активности / фрагментов мне нужно реализовать интерфейс, но я не уверен, что это допустимо, так как я не нашел больше сообщений, поддерживающих это.

Использование Кинжал 2.26

Любая помощь приветствуется.

Заранее спасибо.

1 Ответ

0 голосов
/ 25 февраля 2020

Ваш класс FirstRep должен выглядеть примерно так:

class FirstRep @Inject constructor(val context: Context) {
    ....
}

Когда вам нужно его использовать, просто введите его. Это может быть инжектор конструктора или полевая инъекция. Например, в вашем SplashActivity вы можете просто выполнить инъекцию поля:

@Inject
lateinit var firstRep: FirstRep

Если вы все еще хотите (по какой-то причине) использовать инъекцию поля, чтобы убедиться, что FirstRep имеет контекст, вам нужно внедрить его так же, как вы делаете с SplashActivity ((приложение в качестве приложения) .appComponent.inject (this))

...