Skip to content

Dagger ‐ Using sub‐components with the builder way

Devrath edited this page Oct 8, 2023 · 3 revisions

Observations

Output

Phone is started for the user Superman

Code

Scopes

ActivityScope.kt

@Scope
@MustBeDocumented
@Retention(AnnotationRetention.RUNTIME)
annotation class ActivityScope

Implementations

Battery.kt

class Battery @Inject constructor() {
    fun charging(){
        PrintUtils.printLog("Battery is charging !")
    }
}

Screen.kt

class Screen @Inject constructor() {
    fun displayInformation(){
        PrintUtils.printLog("Screen is displayed !")
    }
}

Phone.kt

class Phone @Inject constructor(
    val battery: Battery, val screen: Screen, val user : User
) {
    fun startPhone(){
        PrintUtils.printLog("Phone is started for the user ${user.name}")
    }
}

User.kt

data class User(val name:String)

Modules

PhoneModule.kt

@Module
@DisableInstallInCheck
class PhoneModule {
    @ActivityScope
    @Provides
    fun providePhone(battery: Battery, screen: Screen, user: User) : Phone {
        return Phone(battery,screen,user)
    }
}

UserModule.kt

@Module
@DisableInstallInCheck
class UserModule {
    @Singleton
    @Provides
    fun provideUser() : User {
        return User(name = "Superman")
    }
}

Components

PhoneComponent.kt

@ActivityScope
@Subcomponent(modules = [PhoneModule::class])
interface PhoneComponent {
    fun inject(activity: DaggerSubComponentsBuilderActivity)


    @Subcomponent.Builder
    interface Builder{
        fun build() : PhoneComponent

    }
}

UserBuilderComponent.kt

@Singleton
@Component(modules = [UserModule::class])
interface UserBuilderComponent {
    fun getPhoneComponentBuilder() : PhoneComponent.Builder
}

Application

DiApplication.kt

@HiltAndroidApp
class DiApplication : Application() {

    private lateinit var userBuilderComponent : UserBuilderComponent

    override fun onCreate() {
        super.onCreate()
        userBuilderComponent = DaggerUserBuilderComponent.builder().build()
    }

    fun provideDaggerUserBuilderComponent(): UserBuilderComponent { return userBuilderComponent }

}

Activity

MyActivity.kt

class MyActivity : AppCompatActivity() {

    private lateinit var binding: ActivityDaggerSubComponentsBuilderBinding

    @Inject lateinit var phone : Phone

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

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

                val userBuilderComponent = (application as DiApplication).provideDaggerUserBuilderComponent()
                val phoneBuilderComp = userBuilderComponent.getPhoneComponentBuilder().build()
                phoneBuilderComp.inject(this@DaggerSubComponentsBuilderActivity)

                phone.startPhone()

            }
        }
    }
}
Clone this wiki locally