Dagger 2 @Singleton 在 LibGDX (kotlin) 中不起作用

Dagger 2 @Singleton does not working in LibGDX (kotlin)

我正在尝试在 Android 上编写一款具有 Dagger 2 功能的游戏。我对@Singleton 有疑问。

我已经创建了模块:

@Module
class SharedModule {

    @Singleton
    @Provides
    fun getDeviceService(): DeviceService = DeviceService()

    @Provides
    @Singleton
    fun getAssetsService(): AssetsService = AssetsService()

    @Singleton
    @Provides
    fun getGameService(): GameService = GameService()
}

和组件

@Singleton
@Component(modules = [SharedModule::class])
interface SharedComponent {
    fun inject(app: MazeSlayers)
    fun inject(screen: SplashScreen)
}

但是当我尝试注入对象时,我总是得到它的一个新实例,app class:

class MazeSlayers : Game() {
    @Inject
    lateinit var assetsService: AssetsService

    @Inject
    lateinit var gameService: GameService

    override fun create() {
        DaggerSharedComponent.create().inject(this)
        gameService.game = this
        assetsService.add(Asset.LOGO)
        this.setScreen(SplashScreen())
    }

    override fun render() {
        super.render()
    }
}

SplashScreen

class SplashScreen : ScreenAdapter() {
    lateinit var batch: SpriteBatch
    var img: Texture? = null

    @Inject
    lateinit var deviceService: DeviceService

    @Inject
    lateinit var assetsService: AssetsService

    @Inject
    lateinit var gameService: GameService

    override fun show() {
        DaggerSharedComponent.create().inject(this)
        batch = gameService.batch
        img = assetsService.getTexture(Asset.LOGO)
    }
...

我做错了什么?

[解决方案]

一个共享的 kotlin 对象解决了我的问题

object DI {
    val shared: SharedComponent = DaggerSharedComponent.create()
}

您正在创建组件两次。因此,每个组件将独立创建其对象。 @Singleton 的效果是,如果您向同一个组件请求相同的绑定两次,您将获得相同的对象。

解决方案是以某种方式只创建一次组件,然后让它创建您需要的所有对象。我不知道在 LibGDX 中实现该目标的方法是什么。