Search code examples
androidandroid-studiokotlinretrofitdagger

Kotlin error: Dagger does not support injection into static fields


i tried to use Dagger for dependency injection in my Retrofit project, but when I build the code it throws this error : Dagger does not support injection into static fields. Does anyone have any idea why I get this error? i cant figure out what I did wrong.

MianActivity.kt:

@Inject
lateinit var  mApiService : ApiService

class MainActivity : AppCompatActivity() {



    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var retroComponent = DaggerRetroComponent.create()
        retroComponent.inject(this)
}

RetroComponet.kt

@Singleton
@Component(modules = [ServiceBuilderModule::class])
interface RetroComponent {
    //Field Injection
    fun inject(mainActivity: MainActivity)
}

ServiceBuilder.kt

@Module
object ServiceBuilderModule {
    val baseUrl = "https://dog-facts-api.herokuapp.com"


    @Singleton
    @Provides
    fun retrofitInstance(): Retrofit {
        return Retrofit.Builder().baseUrl(baseUrl)
            .addConverterFactory(GsonConverterFactory.create())
            .build()
    }

    @Singleton
    @Provides
    fun getRetroServiceInterface(retrofit: Retrofit): ApiService {
        return retrofit.create(ApiService::class.java)
    }

ApiService.kt

interface ApiService {
    @GET("/api/v1/resources/dogs")
    suspend fun getDogFact(@Query("index") index: String): Response<List<DogFactModel>>

}

Solution

  • Replace:

    @Inject
    lateinit var  mApiService : ApiService
    
    class MainActivity : AppCompatActivity() {
    

    with:

    class MainActivity : AppCompatActivity() {
    
    @Inject
    lateinit var  mApiService : ApiService
    

    mApiService needs to a property within MainActivity, not a top-level property.