Внедрить диспетчер AndroidInjector <Service>в App.kt с помощью Dagger2 - PullRequest
0 голосов
/ 06 ноября 2018

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

Я последовал за решением Nauce https://github.com/googlesamples/android-architecture-components/issues/253

App.kt

class App : MultiDexApplication(), HasServiceInjector {

    @Inject lateinit var dispatchingServiceInjector: DispatchingAndroidInjector<Service>

    companion object {
        lateinit var applicationComponent: ApplicationComponent
    }

    override fun serviceInjector() = dispatchingServiceInjector

    override fun onCreate() {
        super.onCreate()

        applicationComponent = DaggerApplicationComponent
                .builder()
                .applicationModule(ApplicationModule(this))
                .build()
    }
}

MyOneSignalMessagingService.kt

@Singleton
class MyOneSignalMessagingService : NotificationExtenderService() {

    @Inject lateinit var ApiService: ApiService

    override fun onCreate() {
        super.onCreate()
        AndroidInjection.inject(this)
    }

  override fun onNotificationProcessing(notification: OSNotificationReceivedResult?): Boolean {
      // He i want to use ApiService
}

Но я не могу ввести dispatchingServiceInjector в App.kt .

Будет выдано lateinit property dispatchingServiceInjector has not been initialized, когда MyOneSignalMessagingService получит уведомление.

1 Ответ

0 голосов
/ 06 ноября 2018

Вы не вводите заявку. Обратите внимание на пример Nauce , что ApplicationComponent имеет этот метод:

@Component(/* ... */) @Singleton public interface AppComponent {
  /* ... */
  void inject(App app);
}

Создав метод с одним аргументом, который возвращает void, вы определили метод внедрения членов , который заполняет @Inject -аннотированные поля и вызывает @Inject -аннотированные методы для существующий экземпляр объекта. Поскольку Android сам создает ваш экземпляр Application, у него не будут автоматически заполняться поля @Inject, поэтому вы можете добавить его к своему компоненту. (Вы делаете то же самое в Службах и Действиях, вызывая AndroidInjection.inject(this), но, поскольку вы несете ответственность за создание собственной реализации Компонента, эквивалентного вызова для Приложения нет.)

Не определяя AppInjector, Nauce вызывает это в onCreate:

AppInjector.init(this);

Но в вашем примере это будет выглядеть примерно так, в App.kt:

override fun onCreate() {
  super.onCreate()

  applicationComponent = DaggerApplicationComponent
      .builder()
      .applicationModule(ApplicationModule(this))
      .build()

  // Inject this class's @Inject-annotated members.
  applicationComponent.inject(this)
}

Для дальнейшего использования у вас также есть выбор: DaggerApplication (в dagger.android или dagger.android.support), который будет автоматически предоставлять все ваши инжекторы, пока вы создаете ApplicationComponent. расширить AndroidInjector<App> и вернуть его из метода applicationInjector() .

...