我尝试在处理接收通知的服务中也使用依赖项注入。
我跟随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
。
答案 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返回。