-
Notifications
You must be signed in to change notification settings - Fork 0
Dagger β multi binding IntoMap
Devrath edited this page Oct 8, 2023
·
3 revisions
Contents |
---|
Observations |
Output |
Code |
- It is also similar to functionality of
IntoSet
,ElementsIntoSet
but difference here is same as amap
has meaning it has akey
and avalue
. - We can iterate the map and get to know both the
key
andvalue
. - We need to use
@IntoMap
in themodule
- Also its better to add a function in
module
annotated as@Multibinds
just to handle the empty set scenario.
class com.istudio.di.modules.dagger.demos.multibindings.intomap.implementation.Inkpen = com.istudio.di.modules.dagger.demos.multibindings.intomap.implementation.Inkpen@512e00a
class com.istudio.di.modules.dagger.demos.multibindings.intomap.implementation.Ballpen = com.istudio.di.modules.dagger.demos.multibindings.intomap.implementation.Ballpen@b08a07b
Contents |
---|
Implementations |
Modules |
Components |
Activity |
Pen.kt
interface Pen {
fun name() : String
}
Inkpen.kt
class Inkpen @Inject constructor() : Pen {
override fun name(): String {
return "Inkpen ^-^ Output"
}
}
Ballpen.kt
class Ballpen @Inject constructor() : Pen {
override fun name(): String {
return "Ballpen ^-^ Output"
}
}
PenModule.kt
@Module
@DisableInstallInCheck
interface PenModule {
@Multibinds
fun multibindsStringProviders(): Map<Class<*>, Pen>
@Binds
@IntoMap
@ClassKey(Inkpen::class)
fun provideInkPen(pen : Inkpen) : Pen
@Binds
@IntoMap
@ClassKey(Ballpen::class)
fun provideBallPen(pen : Ballpen) : Pen
}
PenComponent.kt
@Component(modules = [PenModule::class])
interface PenComponent {
fun inject(activity: MyActivity)
fun providePen(): Map<Class<*>, @JvmSuppressWildcards Pen>
}
MyActivity.kt
class DaggerElementsIIntoMapActivity : AppCompatActivity() {
private lateinit var binding: ActivityDaggerElementsIntoMapBinding
@Inject
lateinit var pen: Map<Class<*>,@JvmSuppressWildcards Pen>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityDaggerElementsIntoMapBinding.inflate(layoutInflater)
setContentView(binding.root)
setOnClickListeners();
}
private fun setOnClickListeners() {
binding.apply {
initiateId.setOnClickListener {
// Inject the component into the activity
val comp = DaggerPenComponent.builder()
.build().inject(this@DaggerElementsIIntoMapActivity)
for ((key, value) in pen) {
// Access specific functionalities
PrintUtils.printLog("$key = $value")
}
}
}
}
}