Dagger Hilt

From bibbleWiki
Jump to navigation Jump to search

Introduction

This page is to summarize new Dagger Hilt

Configuration

Dagger hilt relies on kotlin-kapt and dagger.hilt.android.plugin

plugins {
   id 'com.android.application'
   id 'org.jetbrains.kotlin.android'
   id 'dagger.hilt.android.plugin'
}

dependencies {

  implementation "com.google.dagger:hilt-android:2.40.5"
  kapt "com.google.dagger:hilt-compiler:2.40.5"
  implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03"
  kapt "androidx.hilt:hilt-compiler:1.0.0"
  implementation ("androidx.hilt:hilt-navigation-compose:1.0.0")

}

Example Module

This is an example of an App Module. The InstallIn type decide how long the dependency will live. Examples are

  • ActivityComponent
  • ViewModelComponment
  • SingletonComponent
  • ActivityRetainedComponent Not destroyed when screen rotated
  • ServiceComponent

Note the @Provides is no different to Dagger 2, the @Singleton, not to be confused with the above, decides how many instances to create of this module. In this case we want one instance across the app. If we did not specify @Singleton it would create one on each @Inject request. Note this example also shows an example where the MyRepository depends on MyApi.

@Module
@InstallIn(SingletonComponent::class)
object AppModule {

  @Provides
  @Singleton
  fun provideMyApi(): MyApi {
     return Retrofit.Builder()
        .baseUrl("https://www.bibble.co.nz")
        .build()
        .create(MyApi::class.java)
  }

  @Provides
  @Singleton
  fun provideMyRepository(api: MyApi, app: Application): MyRepository {
    return MyRepositoryImpl(api, app)
  }
  
}

Example ViewModel

Now we are free to inject this into a ViewModel

@HiltViewModel
class MyViewModel 
@Inject constructor(
  private val repository: MyRepository
  private val appContext: Application
): ViewModel() {

}

Example Activity

@AndroidEntryPoint
class MainActivity: ComponentActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContent {
        MyTheme {
          val viewModel = hiltViewModel<MyViewModel>()
        }
    }
  }  
}

Example Application

This is a bit easier than the old days.You will need to provide the Class name in the Manifest as you did with Dagger 2 e.g. name=".MyApp"

@HiltAndroidApp
class Myapp: Application()