使用Dagger2将DispatchingAndroidInjector <service>注入App.kt

时间:2018-11-06 14:22:52

标签: android kotlin dagger-2 onesignal

我尝试在处理接收通知的服务中也使用依赖项注入。

我跟随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
}

但是我无法在 App.kt 中注入dispatchingServiceInjector

lateinit property dispatchingServiceInjector has not been initialized收到通知后,它将抛出MyOneSignalMessagingService

1 个答案:

答案 0 :(得分:0)

您没有注入您的应用程序。请注意,Nauce's example中的ApplicationComponent具有此方法:

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

通过创建一个返回void的单参数方法,您定义了一个members-injection method,它填充了@Inject注释的字段并在上调用@Inject注释的方法现有的对象实例。由于Android本身会创建您的Application实例,因此不会自动填充其@Inject字段,因此您需要将其与组件一起注入。 (您通过调用AndroidInjection.inject(this)在服务和活动中执行相同的操作,但是由于您负责创建自己的Component实现,因此没有等效的Application调用。)

没有定义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扩展{ {1}},然后从applicationInjector() method返回。