-
Notifications
You must be signed in to change notification settings - Fork 0
Dagger β Using subβcomponents with the builder way
Devrath edited this page Oct 8, 2023
·
3 revisions
Contents |
---|
Observations |
Output |
Code |
Phone is started for the user Superman
ActivityScope.kt
@Scope
@MustBeDocumented
@Retention(AnnotationRetention.RUNTIME)
annotation class ActivityScope
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)
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: DaggerSubComponentsBuilderActivity)
@Subcomponent.Builder
interface Builder{
fun build() : PhoneComponent
}
}
UserBuilderComponent.kt
@Singleton
@Component(modules = [UserModule::class])
interface UserBuilderComponent {
fun getPhoneComponentBuilder() : PhoneComponent.Builder
}
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 }
}
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()
}
}
}
}