Skip to content

Dagger ‐ multi binding ElementsIntoSet

Devrath edited this page Oct 8, 2023 · 4 revisions

Observations

  • The observations and behaviors are same as mentioned here in this link
  • The only difference being the @Provides method on how the objects are packed in the set

Output

[com.istudio.di.modules.dagger.demos.multibindings.elementsintoset.implementation.Hyundai@1cf53ac, com.istudio.di.modules.dagger.demos.multibindings.elementsintoset.implementation.Maruti@3cd3875]
Hyundai ^-^ Output
Maruti ^-^ Output

Code

Implementations

Car.kt

interface Car {
    fun name() : String
}

Hyundai.kt

class Hyundai @Inject constructor() : Car {
    override fun name(): String {
        return "Hyundai ^-^ Output"
    }
}

Maruti.kt

class Maruti @Inject constructor() : Car {
    override fun name(): String {
        return "Maruti ^-^ Output"
    }
}

Modules

CarModule.kt

@Module
@DisableInstallInCheck
interface CarModule {
    companion object {
        @Provides
        @ElementsIntoSet
        fun provideCars(): Set<@JvmSuppressWildcards Car> {
            return setOf(
                Hyundai(),
                Maruti()
            )
        }
    }
}

Components

CarComponent.kt

@Component(modules = [CarModule::class])
interface CarComponent {
    fun inject(activity: MyActivity)
    fun provideCars(): Set<@JvmSuppressWildcards Car>
}

Activity

MyActivity.kt

class MyActivity : AppCompatActivity() {

    private lateinit var binding: ActivityDaggerMultiBindingElementsIntoSetBinding

    @Inject lateinit var car : Set<@JvmSuppressWildcards Car>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityDaggerMultiBindingElementsIntoSetBinding.inflate(layoutInflater)
        setContentView(binding.root)
        setOnClickListeners()
    }

    private fun setOnClickListeners() {
        binding.apply {
            initiateId.setOnClickListener {

                val component = DaggerCarComponent.builder().build()
                component.inject(this@DaggerMultiBindingElementsIntoSetActivity)
                // Print the entire set
                PrintUtils.printLog(car.toString())
                car.forEach { c ->
                    if(c is Maruti){
                        // Access Maruti specific functionalities
                        PrintUtils.printLog(c.name())
                    }else if(c is Hyundai){
                        // Access hyundai specific functionalities
                        PrintUtils.printLog(c.name())
                    }
                }
            }
        }
    }
}
Clone this wiki locally