1
votes

I'm a Dagger new and I get the following error using it.

FATAL EXCEPTION: main Process: com.biolabsalta.app, PID: 8028 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.lab.app/com.lab.app.ui.login.LoginActivity}: kotlin.UninitializedPropertyAccessException: lateinit property component has not been initialized

This error happened when I passed my project from java to kotlin. Sharing my code. Please help

ActivityComponent.kt

@PerActivity
@Component(dependencies = arrayOf(ApplicationComponent::class),
        modules = arrayOf(ActivityModule::class))
interface ActivityComponent {

    @ActivityContext
    fun context(): Context

    fun inject(activity: MainActivity)

    fun inject(activity: LoginActivity)

    ...
}

ActivityModule.kt

@Module
class ActivityModule constructor(private val activity: AppCompatActivity) {

    @Provides
    @ActivityContext
    fun provideContext(): Context = activity

    @Provides
    fun provideActivity(): AppCompatActivity = activity

    @Provides
    @PerActivity
    fun provideMainPresenter(
            presenter: MainPresenter<MainMvpView>): MainMvpPresenter<MainMvpView> = presenter

    @Provides
    @PerActivity
    fun providerLoginPresenter(
            presenter: LoginPresenter<LoginMvpView>): LoginMvpPresenter<LoginMvpView> = presenter
...
}

BaseActivity.kt

abstract class BaseActivity : AppCompatActivity(), MvpView {

    lateinit var activityComponent: ActivityComponent

    override val isNetworkConnected: Boolean
        get() = NetworkUtils.isNetworkConnected(applicationContext)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        activityComponent = DaggerActivityComponent.builder()
                .activityModule(ActivityModule(this))
                .applicationComponent(LabApp.component)
                .build()
    }

LoginActivity.kt

class LoginActivity : BaseActivity(), LoginMvpView {

    @Inject
    lateinit var presenter: LoginMvpPresenter<LoginMvpView>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)

        activityComponent.inject(this)

        presenter.onAttach(this)

        btn_login.setOnClickListener{
            presenter.onServerLoginClick(account_email!!.text.toString(),
                    account_password.text.toString())
            hideKeyboard()
        }

LabApp.kt

class LabApp : Application() {

    companion object {
        lateinit var component: ApplicationComponent
    }

    override fun onCreate() {
        super.onCreate()

        component = DaggerApplicationComponent.builder()
                .applicationModule(ApplicationModule(this))
                .build()

        component.inject(this)
    }
}

Can anyone help me? Thanks in advance.

UPDATE I just forgot to declare in the manifest.

android:name=".LabApp"
1
Try to remove component.inject(this) from LabAppp.alexey

1 Answers

0
votes

I don't know anything about dagger but

You are calling

presenter.onAttach(this)

When LoginMvpPresenter<T> is not yet initialized.

@Inject
lateinit var presenter: LoginMvpPresenter<LoginMvpView>