- 
                Notifications
    
You must be signed in to change notification settings  - Fork 0
 
Dagger β Using subβcomponents with the factory way
        Devrath edited this page Oct 8, 2023 
        ·
        4 revisions
      
    Contents | 
|---|
| Observations | 
| Output | 
| Code | 
Phone is started for the user Superman
ActivityScope.kt
@Scope
@MustBeDocumented
@Retention(AnnotationRetention.RUNTIME)
annotation class ActivityScopeBattery.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)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")
    }
}PhoneComponent.kt
@ActivityScope
@Subcomponent(modules = [PhoneModule::class])
interface PhoneComponent {
    fun inject(activity: MyActivity)
    @Subcomponent.Factory
    interface Factory{
        fun create() : PhoneComponent
    }
}UserComponent.kt
@Singleton
@Component(modules = [UserModule::class])
interface UserComponent {
    fun getPhoneComponentFactory() : PhoneComponent.Factory
}
DiApplication.kt
@HiltAndroidApp
class DiApplication : Application() {
    private lateinit var userComponent : UserComponent
    override fun onCreate() {
        super.onCreate()
        userComponent = DaggerUserComponent.builder().build()
    }
    fun provideDaggerUserComponent(): UserComponent { return userComponent }
}class MyActivity : AppCompatActivity() {
    private lateinit var binding: ActivityDaggerSubComponentsFactoryBinding
    @Inject lateinit var phone : Phone
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityDaggerSubComponentsFactoryBinding.inflate(layoutInflater)
        setContentView(binding.root)
        setOnClickListeners();
    }
    private fun setOnClickListeners() {
        binding.apply {
            initiateId.setOnClickListener {
                val userComp = (application as DiApplication).provideDaggerUserComponent()
                val phoneComp = userComp.getPhoneComponentFactory().create()
                phoneComp.inject(this@DaggerSubComponentsFactoryActivity)
                phone.startPhone()
            }
        }
    }
}