匕首注射不在kotlin工作

有人帮我指出为什么我的代码不起作用。 我试图弄清楚,但我不能找出问题,我尝试注入演示,但我得到的错误:

lateinit property appComponent has not been initialized 

看来主持人一直没有注入AppModule

 @Module class AppModule { @Provides @Singleton fun provideMainPresenter(): MainActivityContract.Presenter = MainActivityPresenter() } 

AppComponent

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

应用

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

这是我希望注入演示者的MainActivity

 class MainActivity : AppCompatActivity(), MainActivityContract.View, AnkoLogger { @Inject lateinit var presenter: MainActivityContract.Presenter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) App.appComponent.inject(this) presenter.attachView(this) } } 

这是实现MainActivityContract.Presenter的MainActivityPresenter

 class MainActivityPresenter: MainActivityContract.Presenter { var view: MainActivityContract.View? = null override fun attachView(view: MainActivityContract.View) { this.view = view } override fun detachView() { view = null } override fun performToast(text: String) { } } 

编辑:我设法解决它自己:所有的Android初学者,因为我。 当我们声明应用程序扩展应用程序。 我们也必须声明它是明确的

 <application android:name=".App" /> 

在MainActivity中,您可以替换代码:

 @Inject lateinit var presenter: MainActivityContract.Presenter 

对于

 @field:[Inject] lateinit var presenter: MainActivityContract.Presenter 

您不能将一个静态变量定义为一个lateinit并期望onCreate()将其初始化。 尝试这样的事情:

 class GlobalApplication : Application() { companion object { lateinit var globalApp: GlobalApplication } internal var mApplicationComponent: ApplicationComponent? = null get override fun onCreate() { super.onCreate() globalApp = this //Init Timber if (BuildConfig.DEBUG) { Timber.plant(Timber.DebugTree()) } //Init application component mApplicationComponent = DaggerApplicationComponent.builder() .applicationModule(ApplicationModule(this)) .build() mApplicationComponent?.inject(this) //Ignore URI exposure val builder = StrictMode.VmPolicy.Builder() StrictMode.setVmPolicy(builder.build()) } } 

从这个项目采取: https : //github.com/Obaied/Sohan/blob/master/app/src/main/java/com/obaied/sohan/GlobalApplication.kt