Я новичок в кинжале 2 и в котлин. Получение свойства lateinit не инициализировано.
У меня есть модуль, который имеет несколько методов @Provides, но один из классов не может создать объект, который использовал @Inject и lateinit.
Служба входа в систему принимает "LoginAPI" в качестве параметра и работает нормально, но, поскольку я хочу, чтобы все мои API, связанные с входом в систему, использовали один и тот же сервис. Есть еще один API, связанный "LoginWithOrgAPI" .
Теперь мне нужно получить любой объект API при необходимости в классе LoginService . Поэтому я пытаюсь использовать lateinit с @Inject, как показано в классе LoginService, но он не работает.
@Module(includes = [(NetworkingModule::class)])
class LoginModule {
@Provides
fun provideLoginApi(retrofit: Retrofit): LoginApi =
retrofit.create(LoginApi::class.java)
@Provides
fun provideLoginWithOrgApi(retrofit: Retrofit): LoginWithOrgApi =
retrofit.create(LoginWithOrgApi::class.java)
@Provides
fun provideLoginService(api: LoginApi): LoginService =
LoginService(api)
@Provides
fun provideLoginInteractor(apiService: LoginService): LoginInteractor =
LoginInteractor(apiService)
}
// добавление класса LoginService
class LoginService(val loginAPI: LoginApi) {
@Inject
lateinit var loginWithOrgApi: LoginWithOrgApi
fun loginAPIService(user: String, password: String?, extension: String, otp: String?,
hardwareId: String): Single<LoginAPIResponseData> {
password?.let {
return loginAPI.getLogin(user, it, extension, null, hardwareId)
}?: run {
return loginAPI.getLogin(user, null, extension, otp, hardwareId)
}
}
fun loginWithOrg(user: String, password: String?, extension: String, otp: String?,
userId: String, hardwareId: String): Single<LoginAPIResponseData>{
password?.let {
return loginWithOrgApi.getLogin(user, it, extension, null, userId, hardwareId)
}?: run {
return loginWithOrgApi.getLogin(user, null, extension, otp, userId, hardwareId)
}
}
}
// компонент
@Component(modules = [(LoginModule::class)])
interface LoginComponent {
fun loginInteractor(): LoginInteractor
}
// интерфейс API
interface LoginWithOrgApi {
@POST("access/v1/login/")
@FormUrlEncoded
fun getLogin(@Field("user") user: String,
@Field("password") password: String?,
@Field("mobile_extension") extension: String,
@Field("otp") otp: String?,
@Field("user_id") userId: String,
@Field("hardware_id") hardwareId: String): Single<LoginAPIResponseData>
}
Получение сбоя, говорящего "lateinit" Свойство не инициализируется при попытке вызвать метод "loginWithOrg"
Насколько я понимаю, однажды определив и предоставив через модуль, я могу получить объект через @Inject в графе зависимостей, но здесь чего-то не хватает.
// моя цель для класса LoginService
class LoginService() {
@Inject
var loginWithOrgApi: LoginWithOrgApi
@Inject
var loginApi: LoginApi
fun loginAPIService(user: String, password: String?, extension: String, otp: String?,
hardwareId: String): Single<LoginAPIResponseData> {
password?.let {
return loginAPI.getLogin(user, it, extension, null, hardwareId)
}?: run {
return loginAPI.getLogin(user, null, extension, otp, hardwareId)
}
}
fun loginWithOrg(user: String, password: String?, extension: String, otp: String?,
userId: String, hardwareId: String): Single<LoginAPIResponseData>{
password?.let {
return loginWithOrgApi.getLogin(user, it, extension, null, userId, hardwareId)
}?: run {
return loginWithOrgApi.getLogin(user, null, extension, otp, userId, hardwareId)
}
}
}