[英]Proper way to inject a class that implements an interface using Hilt
我有
BeatPlayer.kt
interface BeatPlayer {
fun getSession(): MediaSessionCompat
fun playSong(extras: Bundle = bundleOf(BY_UI_KEY to true))
fun playSong(id: Long)
fun playSong(song: Song)
}
class BeatPlayerImplementation(
private val context: Application,
private val musicPlayer: AudioPlayer,
private val songsRepository: SongsRepository,
private val queueUtils: QueueUtils,
private val audioFocusHelper: AudioFocusHelper
) : BeatPlayer {
.........
}
音乐服务.kt
@AndroidEntryPoint
class MusicService : CoroutineService(Main) {
@Inject
lateinit var beatPlayer: BeatPlayer
}
当我运行它说:
[Dagger/MissingBinding] 如果没有 @Provides 注释方法,则无法提供 BeatPlayer。
所以我添加了这个:
@Module
@InstallIn(SingletonComponent::class)
abstract class StorageModule {
@Singleton
@Binds
abstract fun bindBeatPlayer(beatPlayer: BeatPlayer): BeatPlayerImplementation
}
现在,我运行,它说:
错误:@Binds 方法的参数类型必须可分配给返回类型刀柄
如何正确操作?
我将根据@HenryTest 的评论回答我的问题。
存储模块.kt
@Module
@InstallIn(SingletonComponent::class)
abstract class StorageModule {
@Binds
abstract fun bindsPreferenceStorage(preferenceStorageImpl:
PreferenceStorageImpl): PreferenceStorage
@Singleton
@Binds
abstract fun bindBeatPlayer(beatPlayer: BeatPlayerImplementation):
BeatPlayer
}
现在提供 BeatPlayer 实现。
应用模块.kt
@Singleton
@Provides
fun providesBeatPlayerImplementation(@ApplicationContext context:
Context.,.,.,.) =
BeatPlayerImplementation(
context, .., .., ..,
)
要么
在BeatPlayer 中实现
class BeatPlayerImplementation @Inject constructor(
@ApplicationContext private val context: Application,
.....
) : BeatPlayer {
.........
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.