匕首注射不在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