我已经创建了简单的应用来测试Dagger 2注入。我想我已经写了一切属性,但在运行时我得到这个错误。
kotlin.UninitializedPropertyAccessException: lateinit property app has not been initialized
事实证明,没有任何依赖注入。
以下是我的例子:
组件:
@Component(modules = arrayOf(AppModule::class))
interface AppComponent {
fun inject(app : App)
}
IMainomponent:
@Component(modules = arrayOf(MainPresenterModule::class))
interface IMainComponent {
fun inject(mainView : MainActivity)
}
的AppModule:
@Module
class AppModule(val app: App) {
@Provides @Singleton fun provideApp() : App = app
}
主要演示者模块:
@Module
class MainPresenterModule(private val view: MainActivity) {
@Provides
fun provideView() : MainActivity = view
}
在活动中使用:
class MainActivity : AppCompatActivity(), IMainView {
@Inject lateinit var presenter : MainPresenter
@Inject lateinit var app : App
val component: IMainComponent by lazy {
DaggerIMainComponent
.builder()
.mainPresenterModule(MainPresenterModule(this))
.build()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
component.inject(this)
// presenter.beginMessuring()
if(app != null) // fails here because all lateinits are null
{
}
}
override fun toastMessage(message: String) {
Toast.makeText(this, message, Toast.LENGTH_LONG).show()
}
}
你能不能告诉我我做错了什么。
Gradle dagger settigns:
kapt 'com.google.dagger:dagger-compiler:2.13'
implementation 'com.google.dagger:dagger:2.13'
编辑:
我已经知道当我使用例如这个配置Dagger图时,
DaggerIMainComponent.builder().mainPresenterModule(MainPresenterModule(this)).build()
我得到的信息是不推荐使用mainPresenterModule方法。我发现android工作室通常会在找不到构建模块提供的任何@Inject组件时显示该信息。