Кинжал2 не вводит

Я новичок в android и пытаюсь использовать Dagger2. Я провожу всю ночь и до сих пор не знаю, почему мой кинжал не дает докладчика. Вот мой код (я использую Kotlin)

AppComponent

@Singleton @Component(modules = arrayOf(PresenterModule::class)) interface AppComponent { fun inject(target: SplashActivity) } 

PresenterModule

 @Module class PresenterModule { @Provides @Singleton fun provideSplashPresenter(): SplashPresenter { return SplashPresenter() } } 

Приложение

 class App: Application() { companion object { lateinit var appComponent: AppComponent } override fun onCreate() { super.onCreate() appComponent = initDagger() } private fun initDagger(): AppComponent { return DaggerAppComponent.create() } } 

Это ведущий

 class SplashPresenter: BasePresenterImpl<SplashContract.View>(), SplashContract.Presenter { override fun performToast(mess: String) { logi("abc", "performToast") logi("abc", "mess: " + mess) mView?.showLoading() if (mess.isNullOrBlank()) { mView?.showTosat("this is empty mess") ?: logi("abc", "null") } else { mView?.showTosat(mess) ?: logi("abc", "null") } mView?.hideLoading() } } 

И, наконец, это моя SplashActivity

 class SplashActivity : BaseActivity(), SplashContract.View { @Inject lateinit var presenter: SplashPresenter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_splash) presenter.attachView(this) //TODO: check log in //TODO: If logged in => start main screen //TODO: If not logged in => load login activity button.setOnClickListener{ presenter.performToast(editText.text.toString()) logi("abc", "perform clicked") } } } 

Когда я запускаю этот код, я получил эту ошибку. Презентатор свойства Lateinit не был инициализирован, что означает, что «Inject» не работает

Поскольку вы не используете здесь конструкторскую инъекцию (чего вы не можете, потому что вы не являетесь «владельцем» конструктора активности), Кинжал не «знает», что ему нужно что-то вводить в свою Activity . Вы должны вручную ввести так:

 (applicationContext as App).appComponent.inject(this) 

в вашем SplashActivity onCreate() прежде чем использовать презентатора, конечно).

Во-вторых, вашему ведущему нужен конструктор, который сообщает кинжалу, как построить / «построить» презентатор, что означает конструктор, аннотированный аннотацией @Inject , так что:

 class SplashPresenter @Inject constructor(): BasePresenterImpl<SplashContract.View>(), SplashContract.Presenter 

Вы забыли ввести SplashActivity:

 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) App.appComponent.inject(this) setContentView(R.layout.activity_splash) ... 
Intereting Posts
Тип несоответствия: выведенный тип – String? но String ожидалось в kotlin Определение функции: fun vs val Шаблон строителя в Котлине Как проверить, была ли инициализирована переменная «lateinit»? как добавить gradle (идеально используя kotlin-dsl) в существующий проект intellij python Изменить текучесть <Список <Obj1 >> в текущую <Список <Obj2 >> в комнате Как определить свойство типа класса с помощью get () в Котлине Android Studio Version 3.0 Канальные каналы, не предоставляющие библиотеки поддержки Как я могу отобразить свое представление anko без вызова overriding onCreate? Как заставить MockWebServer работать? Конструкция объявления Koltin Generic-site <a T> Невозможно создать прослушиватель событий Spring Data в Котлине Как реализовать обратный вызов TornadoFX WebEngine в Котлине Почему Kotlin получает такое UndeclaredThrowableException, а не исключение ParseException? Ошибка: выполнение выполнено для задачи ': app: kaptDebugKotlin'