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 中实现该目标的方法是什么。
我正在尝试在 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 中实现该目标的方法是什么。