#android #kotlin #dagger-2 #android-jetpack #dagger-hilt
#Android #kotlin #кинжал-2 #android-jetpack #рукоять кинжала
Вопрос:
У меня есть приложение для Android, и я хотел бы выполнить внедрение зависимостей в класс, который не является activity или fragment, поэтому ApplicationContext отсутствует.
@HiltAndroidApp
class App: Application {
@Inject
lateinit var analytics: Analytics
override fun onCreate() {
super.onCreate()
// other details
}
}
Мой AppModule
@Module
@InstallIn(ApplicationComponent::class)
abstract class AppModule() {
companion object {
@Provide
@Singleton
fun provideSomeClass(): SomeClass = SomeClass()
}
}
Если я пытаюсь ввести SomeClass в activity, он работает нормально, но не в классе, не являющемся activity, он завершается с ошибкой, объект не инициализируется.
class Consumer {
@lateinit var SomeClass someClass;
}
Может кто-нибудь указать, что я делаю неправильно?
Комментарии:
1. Вы получили решение без конструктора?
Ответ №1:
Внедрить поле класса неактивности
Для этого вам нужно создать an Interface
, который будет an @EntryPoint
, и передать этому интерфейсу ApplicationContext
.
Пример кода:
// No annotations here
class Consumer(ctx: Context) { // pass here the Android context
// Create an Interface (required by @InstallIn)
@EntryPoint
@InstallIn(SingletonComponent::class) // this could be implementation specific
interface Injector {
fun getSomeClass(): SomeClass // getter that will be injected
// you can also define a proper Kotlin Getter here
}
// create the injector object
val injector = EntryPoints.get(ctx, Injector::class.java)
// retrieve the injected object
val someObject = injector.getSomeClass()
suspend fun andFinallyUseIt() {
someObject.someMethod()
}
}
Еще:
- Убедитесь, что вы не меняете свою область видимости
- Подробнее: Кинжал @EntryPoint
Ответ №2:
Используйте инъекцию в конструкторе
class Consumer @Inject constructor(private val someclass:SomeClass){
//some code
}
Комментарии:
1. что делать, если мы не хотим использовать конструктор?