我正在尝试在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()
}
您要两次创建组件。因此,每个组件将独立创建其对象。 @Singleton的作用是,如果两次向相同的组件请求相同的绑定,则会得到相同的对象。
解决方案是只以某种方式创建您的组件,然后让它创建您需要的所有对象。我不知道在LibGDX中实现该目标的方法是什么。