Skip to content

Dagger ‐ multi binding IntoMap

Devrath edited this page Oct 8, 2023 · 3 revisions

Observations

  • It is also similar to functionality of IntoSet,ElementsIntoSet but difference here is same as a map has meaning it has a key and a value.
  • We can iterate the map and get to know both the key and value.
  • We need to use @IntoMap in the module
  • Also its better to add a function in module annotated as @Multibinds just to handle the empty set scenario.

Output

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

Code

Implementations

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"
    }
}

Modules

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

}

Components

PenComponent.kt

@Component(modules = [PenModule::class])
interface PenComponent {
    fun inject(activity: MyActivity)
    fun providePen(): Map<Class<*>, @JvmSuppressWildcards Pen>
}

Activity

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")
                }
            }
        }
    }
}
Clone this wiki locally