Android 安卓kotlin注入改造
apimule.ktAndroid 安卓kotlin注入改造,android,kotlin,retrofit,dagger-2,Android,Kotlin,Retrofit,Dagger 2,apimule.kt @Module class ApiModule { @Provides @Singleton fun provideRetrofit(): Retrofit { return Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .bui
@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()
}
}
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())
}
}
interface HeroesApi {
@GET("/marvel")
fun getAllHeroes(): Call<List<Hero>>
}
apimager.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()
}
}
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())
}
}
interface HeroesApi {
@GET("/marvel")
fun getAllHeroes(): Call<List<Hero>>
}
类管理器{
@注入
lateinit var mRetrofit:改装
fun getAllHeroes():MutableLiveData{
val mherosapi=mRetrofit.create(herosapi::class.java)
返回NetworkHandler().makeCall(mherosapi.getAllHeroes())
}
}
HeroesApi.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()
}
}
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())
}
}
interface HeroesApi {
@GET("/marvel")
fun getAllHeroes(): Call<List<Hero>>
}
接口HeroesApi{
@获取(“/marvel”)
fun getAllHeroes():调用
}
我犯了一个错误
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)
原因:kotlin.UninitializedPropertyAccessException:lateinit属性mRetrofit尚未初始化
在com.hardik.repository.network.apimager.getAllHeroes上(apimager.kt:17)
位于com.hardik.repository.repository.getHeroesFromNetwork(repository.kt:16)
在com.hardik.androidtemplate.usecase.GetHeroesUseCase.execute上(GetHeroesUseCase.kt:14)
在com.hardik.androidtemplate.viewmodel.HeroListViewModel.(HeroListViewModel.kt:9)
有关更多详细信息,请告诉我您不需要在
apimager
中插入改装
实例。您已经在apimule
中为HeroesApi
提供了方法,因此您可以直接传递它。首先用以下方法更改您的APIMAger:
class ApiManager(private val mHeroesApi: HeroesApi) {
fun getAllHeroes(): MutableLiveData<Result<List<Hero>>> {
return NetworkHandler<List<Hero>>().makeCall(mHeroesApi.getAllHeroes())
}
}
或
您只需将apimager
更改为将HorseApi
注入构造函数,甚至不需要为apimager
提供方法。为此,请使用以下内容更改apimager:
// Notice the @Inject before constructor
class ApiManager @Inject constructor(private val mHeroesApi: HeroesApi) {
fun getAllHeroes(): MutableLiveData<Result<List<Hero>>> {
return NetworkHandler<List<Hero>>().makeCall(mHeroesApi.getAllHeroes())
}
}
您不需要在apimager
中注入改造
实例。您已经在apimule
中为HeroesApi
提供了方法,因此您可以直接传递它。首先用以下方法更改您的APIMAger:
class ApiManager(private val mHeroesApi: HeroesApi) {
fun getAllHeroes(): MutableLiveData<Result<List<Hero>>> {
return NetworkHandler<List<Hero>>().makeCall(mHeroesApi.getAllHeroes())
}
}
或
您只需将apimager
更改为将HorseApi
注入构造函数,甚至不需要为apimager
提供方法。为此,请使用以下内容更改apimager:
// Notice the @Inject before constructor
class ApiManager @Inject constructor(private val mHeroesApi: HeroesApi) {
fun getAllHeroes(): MutableLiveData<Result<List<Hero>>> {
return NetworkHandler<List<Hero>>().makeCall(mHeroesApi.getAllHeroes())
}
}
同意你的回答(+1)。但我想以字段注入的形式注入改造(不是通过构造函数),那么我该怎么做呢?字段注入只适用于不能自己构建的类,例如活动。对于像ApiManager这样可以自己构造的其他类,应该始终只使用构造函数注入。如果您仍然希望进行字段注入,那么您需要使用类似fun inject(apimager:apimager)
的方法为apimager创建一个组件,然后在apimager
的init bloc中,您需要编写yourapimanager组件。inject(this)
。我认为您不想为这里不推荐的字段注入做所有这些:)同意您的答案(+1)。但我想作为字段注入(而不是通过构造函数)注入改造,那么我该怎么做呢?字段注入仅适用于您不能自己构建的类,例如活动。对于像ApiManager这样可以自己构造的其他类,应该始终只使用构造函数注入。如果您仍然希望进行字段注入,那么您需要使用类似fun inject(apimager:apimager)
的方法为apimager创建一个组件,然后在apimager
的init bloc中,您需要编写yourapimanager组件。inject(this)
。我认为您不想为现场注入做所有这些,这里不建议这样做:)