Android Как вводить переменные зависимости в неактивность?

#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()
  }
}

 

Еще:

Ответ №2:

Используйте инъекцию в конструкторе

 class Consumer @Inject constructor(private val someclass:SomeClass){
   //some code
}
 

Комментарии:

1. что делать, если мы не хотим использовать конструктор?