【问题标题】:Proper way to inject a class that implements an interface using Hilt使用 Hilt 注入实现接口的类的正确方法
【发布时间】:2021-07-24 08:27:08
【问题描述】:

我有

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 {
 .........

 }

MusicService.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 方法的参数类型必须可分配给返回类型 hilt

如何正确操作?

【问题讨论】:

  • 您的绑定方式错误,您需要一个返回BeatPlayer 并输入BeatPlayerImplementation 的方法。
  • 好的,有代码示例吗??
  • abstract fun bindBeatPlayer(beatPlayer: BeatPlayerImplementation): BeatPlayer
  • 现在我得到 - 错误:如果没有 @Inject 构造函数或提供注释的方法,就无法提供 BeatPlayerImplementation。
  • 是的,您需要某种方式来提供它,也许初学者 Dagger/Hilt 教程会是个好主意?如果您似乎还没有掌握基础知识。

标签: android android-studio kotlin dependency-injection dagger-hilt


【解决方案1】:

我将根据@HenryTest 的评论回答我的问题。

StorageModule.kt

@Module
@InstallIn(SingletonComponent::class)
abstract class StorageModule {
@Binds
abstract fun bindsPreferenceStorage(preferenceStorageImpl: 
PreferenceStorageImpl): PreferenceStorage

@Singleton
@Binds
abstract fun bindBeatPlayer(beatPlayer: BeatPlayerImplementation): 
BeatPlayer
}

现在提供 BeatPlayerImplementation。

AppModule.kt

 @Singleton
 @Provides
 fun providesBeatPlayerImplementation(@ApplicationContext context: 
 Context.,.,.,.) = 
 BeatPlayerImplementation(
    context, .., .., ..,  
 )

BeatPlayerImplementation

 class BeatPlayerImplementation @Inject constructor(
 @ApplicationContext private val context: Application,
 .....
 ) : BeatPlayer {
 .........
 }

【讨论】:

  • fun providesBeatPlayerImplementation 你可以在这个类的构造函数上使用@Inject,Hilt 会知道如何提供BeatPlayerImplementation
  • 啊哈..正是@Pentiux
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2016-07-25
相关资源
最近更新 更多