UninitializedPropertyAccessException происходит, когда я использую @inject в моем докладчике - PullRequest
0 голосов
/ 25 февраля 2019

Получаю UninitializedPropertyAccessException, когда я внедряю меторд в моем докладчике

Мой класс провайдера

@Module
class ActivityModule(private var activity: BaseActivity) {

@Provides
fun provideActivity(): BaseActivity {
    return activity
}


@Provides
@Inject
fun providePresenter(): MainContract.Presenter {
    return MainPresenter()
}

@Provides
@Singleton
fun provideGson(): Gson {

    return GsonBuilder().setLenient().create()
}

@Provides
@Inject
@Singleton
fun provideServiceGenerator(): ServiceGenerator {

    return ServiceGenerator()
 }
}

Мой класс компонентов

@Component(modules = [ActivityModule::class])
interface ActivityComponent {
fun inject(mainActivity: MainActivity)
}

И в моем классе Activity iВнедряю компоненты, как показано ниже

val activityComponent = DaggerActivityComponent.builder()
        .activityModule(ActivityModule(this))
        .build()
    activityComponent.inject(this)

Все отлично работает при нажатии кнопки. Я звоню по одному API. Как вы можете видеть в моем сообщении, у меня есть MainContract.Presenter , я делаю инъекциюPresenter в моей деятельности, и он успешно введен.

@Inject
lateinit var presenter: MainContract.Presenter

Теперь в My Presenter есть класс ServiceGenerator , который я также предоставил в своем классе провайдера, и я внедряю генератор услуг в моемPresenter, проблема возникает, когда я называю докладчика, что введенный ServiceGenerator внутри докладчика дает UninitializedPropertyAccessException В чем причина и как я могу это решить?Фрагмент класса докладчика, как показано ниже

class MainPresenter : MainContract.Presenter {
@Inject
lateinit var serviceGenerator: ServiceGenerator

Когда я отвечаю на вызов val newsService = serviceGenerator.createService(ApiService::class.java,Constants.BASE_URL)

, получаю сообщение об ошибке, сообщите мне, если я что-то делаю не так

1 Ответ

0 голосов
/ 25 февраля 2019

Вы можете сделать одну из двух вещей:

  • Придерживайтесь ввода свойства / поля для вашего докладчика, в этом случае вам необходимо добавить метод inject для него в вашем Компонентеи вызовите его в своем докладчике, точно так же, как вы сделали с вашим Activity.

  • Использовать внедрение конструктора, таким образом, зависимости докладчика будут вводиться «автоматически» при вводев Activity:

    class MainPresenter @Inject constructor(
        private val serviceGenerator: ServiceGenerator
    ) : MainContract.Presenter {
    
    }
    
...