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

问题描述 投票:0回答:1

我正在尝试在Android上使用匕首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)
}

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

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)
    }
...

我做错了什么?

[SOLUTION]

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

object DI {
    val shared: SharedComponent = DaggerSharedComponent.create()
}
kotlin libgdx dagger-2
1个回答
1
投票

您要两次创建组件。因此,每个组件将独立创建其对象。 @Singleton的作用是,如果两次向相同的组件请求相同的绑定,则会得到相同的对象。

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

© www.soinside.com 2019 - 2024. All rights reserved.