如何在对象类kotlin中使用Dagger中的Application Context

时间:2018-04-12 10:34:02

标签: android socket.io kotlin dagger-2

如何在Dagger2中使用应用程序上下文

    @Module
class AppModule(private val app: App) {
    @Provides
    @Singleton
    @AppContextQualifier
    fun provideApplication(): App = app
}

在类

object SocketConnection  {

 private fun listenSocketEvents() {

    socket?.on(SocketContent.JOINED, { args ->
       //Toast.makeText(context!!,"logout",Toast.LENGTH_LONG).show()
    })
}
}

我想在socket监听任何数据时吐司。所以需要提供一个如何在对象类中获取匕首应用程序上下文的上下文。

这可能还是有另一种方法可以实现?

2 个答案:

答案 0 :(得分:1)

而不是object SocketConnection {

应该是

@Singleton 
class SocketConnection @Inject constructor(
   @AppContextQualifier private val app: App
) {
     private fun listenSocketEvents() {
        socket?.on(SocketContent.JOINED, { args ->
           Toast.makeText(app,"logout",Toast.LENGTH_LONG).show()
        })
     }
}

答案 1 :(得分:0)

使用Dagger 2时,使用Kotlin object关键字来生成等效的静态单例不是必需的。通过Kotlin object关键字手动声明单例,Dagger 2可以更灵活地管理范围,您在AppModule中提供的所有依赖关系将最终成为应用程序范围的单例。

如果您的SocketConnection打算成为单身人士,请在classAppModule范围内的其他模块中提供@Singleton

class SocketConnection constructor(private val app: App) {

   private fun listenSocketEvents() {
       //
   }
}

使用@Inject注释构造函数,或者如果您想在AppModule中提供构造函数:

@Module
class AppModule(private val app: App) {

    @Provides
    @Singleton
    fun provideSocketConnection(app: App): SocketConnection =
        SocketConection(app)

}