Dagger 2 @Singleton не работает в LibGDX (kotlin) - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь написать игру на 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)
    }
...

Что я делаю не так?

[РЕШЕНИЕ]

Один общий kotlin объект решил мою проблему

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

1 Ответ

1 голос
/ 03 марта 2020

Вы создаете свой компонент дважды. Следовательно, каждый компонент будет самостоятельно создавать свои объекты. Эффект @ Singleton заключается в том, что если вы дважды запрашиваете один и тот же компонент для одной и той же привязки, вы получаете один и тот же объект.

Решение состоит в том, чтобы каким-то образом создать компонент только один раз и позволить ему создавать все необходимые вам объекты. Я понятия не имею, как добиться этого в LibGDX.

...