注入改造的Android Kotlin

问题描述 投票:0回答:1

ApiModule.kt

@Module
class ApiModule {

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

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


    @Provides
    @Singleton
    fun provideApiManager(): ApiManager {
        return ApiManager()
    }
}

ApiManager.kt

class ApiManager {

    @Inject
    lateinit var mRetrofit: Retrofit

    fun getAllHeroes(): MutableLiveData<Result<List<Hero>>> {
        val mHeroesApi = mRetrofit.create(HeroesApi::class.java)
        return NetworkHandler<List<Hero>>().makeCall(mHeroesApi.getAllHeroes())
    }
}

HeroesApi.kt

interface HeroesApi {

    @GET("/marvel")
    fun getAllHeroes(): Call<List<Hero>>

}

我得到的错误

Caused by: kotlin.UninitializedPropertyAccessException: lateinit property mRetrofit has not been initialized
        at com.hardik.repository.network.ApiManager.getAllHeroes(ApiManager.kt:17)
        at com.hardik.repository.Repository.getHeroesFromNetwork(Repository.kt:16)
        at com.hardik.androidtemplate.usecase.GetHeroesUseCase.execute(GetHeroesUseCase.kt:14)
        at com.hardik.androidtemplate.viewmodel.HeroListViewModel.<init>(HeroListViewModel.kt:9)

让我知道更多信息

android kotlin retrofit dagger-2
1个回答
1
投票

您不需要在Retrofit中插入ApiManager实例。 Provide中已经具有HeroesApiApiModule方法,因此您可以直接传递它。首先用:更改ApiManager

class ApiManager(private val mHeroesApi: HeroesApi) {

    fun getAllHeroes(): MutableLiveData<Result<List<Hero>>> {
        return NetworkHandler<List<Hero>>().makeCall(mHeroesApi.getAllHeroes())
    }
}

然后更改您的ApiModule

@Module
class ApiModule {

   // Rest code same as it is already

    @Provides
    @Singleton
    // Since you already have Provide method which provides HerosApi,
    // Dagger will automatically inject this below.
    fun provideApiManager(herosApi: HerosApi): ApiManager {
        return ApiManager(herosApi)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.