Sobes.tech
Middle

What is Dagger and what is it used for in Android development?

sobes.tech AI

Answer from AI

Dagger is a dependency injection (DI) framework for Java and Kotlin.

It is used in Android development for:

  1. Simplifying testing: Allows easy substitution of real dependencies with mocks or stubs during tests.
  2. Reducing coupling: Application components become less dependent on each other, making code modification and maintenance easier.
  3. Reusing code: Common dependencies can be easily provided to different parts of the application.
  4. Managing object lifecycle: Dagger can manage creation and lifecycle of objects, for example, using scopes.
  5. Improving architecture: Facilitates building modular and scalable applications.

Dagger works at compile time, generating code that performs dependency injection. This results in higher performance compared to reflection-based DI frameworks.

Main concepts of Dagger:

  • @Module: Classes that provide dependencies. Methods annotated with @Provides return dependency instances.
    // Example module
    @Module
    class AppModule {
    
        @Provides
        fun provideApiService(): ApiService {
            return ApiService() // Assuming ApiService is some dependency
        }
    }
    
  • @Component: Interfaces that define the dependency graph and provide access points for injection.
    // Example component
    @Component(modules = [AppModule::class])
    interface AppComponent {
    
        fun inject(activity: MainActivity) // Method for injecting dependencies into MainActivity
    }
    
  • @Inject: Annotation used to request dependencies. Can be applied to constructor, field, or method.
    // Example of using @Inject
    class MainActivity : AppCompatActivity() {
    
        @Inject
        lateinit var apiService: ApiService // Requesting ApiService dependency
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            // Inject dependencies via component
            (application as App).appComponent.inject(this)
    
            // apiService is now initialized
            apiService.callApi()
        }
    }
    
  • @Scope: Annotations that define the lifecycle of provided objects within a component. For example, @Singleton.

Dagger requires some initial setup and learning, but its advantages in medium and large Android applications justify the effort.