Android 安卓kotlin注入改造

Android 安卓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

apimule.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>>

}
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)
。我认为您不想为现场注入做所有这些,这里不建议这样做:)