Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin Android MVP+;Dagger 2 lateinit属性呈现程序尚未初始化_Android_Kotlin_Dagger 2_Android Mvp - Fatal编程技术网

Kotlin Android MVP+;Dagger 2 lateinit属性呈现程序尚未初始化

Kotlin Android MVP+;Dagger 2 lateinit属性呈现程序尚未初始化,android,kotlin,dagger-2,android-mvp,Android,Kotlin,Dagger 2,Android Mvp,试图在Android上使用Dagger和Kotlin。我得到了一个例外: Caused by: kotlin.UninitializedPropertyAccessException: lateinit property presenter has not been initialized at com.ad.eartquakekotlin.main.MainFragment.onViewCreated(MainFragment.kt:43) at androidx.fragme

试图在Android上使用Dagger和Kotlin。我得到了一个例外:

Caused by: kotlin.UninitializedPropertyAccessException: lateinit property presenter has not been initialized
    at com.ad.eartquakekotlin.main.MainFragment.onViewCreated(MainFragment.kt:43)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1471)
    at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
    at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:802)
    at ...
该应用程序专门用于测试。我得到地震并在设备屏幕上显示

我只想 1.将演示者插入我的片段(视图) 2.在我的演示者中注入api

class MainPresenter (var view: MainContract.View?) : MainContract.Presenter {

private var disposable: Disposable? = null
@Inject lateinit var api : EarthquakeApi

override fun onDestroy() {
    disposable?.dispose()
    view = null
}

override fun loadData() {
    view?.showLoading()

    disposable = api.getEarthquakes()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(
                    {
                        response ->
                        view?.showData(response)
                        view?.hideLoading()
                    },
                    {
                        throwable ->
                        view?.showMessage(throwable.message ?: "Ошибка")
                        view?.hideLoading()
                    }
            )
}
我的项目结构如下:

如您所见,这里有两个模块和组件:

@Module
class ApplicationModule(private val application: Application) {
    @Provides
    @Singleton
    fun provideApplication():Application = application
}

@Module
class MainModule (private val view: MainContract.View) {
    @Provides
    fun provideView(): MainContract.View {
        return view
    }

    @Provides
    fun providePresenter(): MainContract.Presenter {
        return MainPresenter(view)
    }
}
和组成部分:

@Component(modules = [ApplicationModule::class])
interface ApplicationComponent {
    fun inject(application: Application)
    fun plus (mainModule: MainModule) : MainComponent
}

有一个合同:

interface MainContract {
interface View {
    fun showLoading()
    fun hideLoading()
    fun showMessage(message: String)
    fun showData(data: EarthquakeRootObject)

}
interface Presenter {
    fun onDestroy()
    fun loadData()
}
}
应用程序类别:

class MainApp: Application() {

companion object {
    lateinit var graph: ApplicationComponent
}

override fun onCreate() {
    super.onCreate()
    buildGraph()
}

private fun buildGraph() {
    graph = DaggerApplicationComponent
            .builder()
            .applicationModule(ApplicationModule(this))
            .build()
}
}
片段(我想使用注入的地方)

还有我的演讲者

class MainPresenter (var view: MainContract.View?) : MainContract.Presenter {

private var disposable: Disposable? = null
@Inject lateinit var api : EarthquakeApi

override fun onDestroy() {
    disposable?.dispose()
    view = null
}

override fun loadData() {
    view?.showLoading()

    disposable = api.getEarthquakes()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(
                    {
                        response ->
                        view?.showData(response)
                        view?.hideLoading()
                    },
                    {
                        throwable ->
                        view?.showMessage(throwable.message ?: "Ошибка")
                        view?.hideLoading()
                    }
            )
}
我做错了什么

您需要更换

fun inject (view : MainContract.View)

你需要更换

fun inject (view : MainContract.View)


MainComponent
code是这个问题最重要的文件,它丢失了。@EpicPandaForce已更新,谢谢。
MainComponent
code是这个问题最重要的文件,它丢失了。@EpicPandaForce已更新,谢谢。但在演示者“lateinit属性api尚未初始化”中,我得到了更深入的相同异常。我需要在那里执行component.inject()吗?实际上,您缺少
类MainPresenter@inject构造函数(val view
,并且不需要@inject lateinit var。谢谢。但是我得到了更深入的相同异常,在presenter“lateinit属性api尚未初始化”。我需要执行component.inject()吗那里?实际上,您缺少
类MainPresenter@injectconstructor(val view
),不需要@injectlateinit变量。
fun inject(target : MainFragment)