【发布时间】:2020-10-27 08:08:28
【问题描述】:
我第一次使用 dagger 尝试将上下文注入存储库以加载资产。但是我收到此错误
java.lang.NullPointerException: Attempt to invoke virtual method
'android.content.res.AssetManager android.content.Context.getAssets()'
on a null object reference
at android.content.ContextWrapper.getAssets(ContextWrapper.java:92)
at myJSONLoader.getJsonAsset(myJSONLoader.kt:11)
at repository.myRepository.getData(myRepository.kt:32)
at presenter.myPresenter.getData(myPresenter.kt:28)
at view.myFragment.onViewCreated(myFragment.kt:51)
上下文似乎不为空,但在调试时我看到 mBase 为空。我该如何解决这个问题?
MyApp.kt
class myApp : Application(), HasAndroidInjector {
@Inject
lateinit var androidInjector : DispatchingAndroidInjector<Any>
override fun onCreate() {
super.onCreate()
DaggerAppComponent.builder()
.application(this)
.appModule(AppModule(this))
.build()
.inject(this)
}
override fun androidInjector(): AndroidInjector<Any> = androidInjector
}
AppComponent.kt
@Singleton
@Component(modules = [
AndroidInjectionModule::class,
AppModule::class,
ActivityModule::class])
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
fun appModule(appModule: AppModule): Builder
fun build(): AppComponent
}
fun inject(activity: MainActivity)
fun inject(instance: myApp)
fun inject(repository: myRepository)
fun inject(presenter: myPresenter)
}
AppModule.kt
@Module
class AppModule(private val app: Application) {
@Provides
@Singleton
fun provideContext(): Context = app
@Provides
@Singleton
fun provideMyRepository(): myContract.Repository = myRepository(app)
}
Repository.kt
class myRepository @Inject constructor(private val context: Context) : myContract.Repository {
private fun inject() {
DaggerAppComponent.builder()
.application(myApp())
.appModule(AppModule(myApp()))
.build().inject(this)
}
}
build.gradle
implementation 'com.google.dagger:dagger-android:2.23'
implementation 'com.google.dagger:dagger-android-support:2.23'// if you use the support libraries
kapt 'com.google.dagger:dagger-android-processor:2.23'
kapt 'com.google.dagger:dagger-compiler:2.23'
compileOnly 'javax.annotation:javax.annotation-api:1.3.2'
我将存储库注入演示者没有问题。它将上下文注入到存储库中。
编辑:我已经将应用名称添加到 android manifest 并尝试在 AppModule 中调用 app.applicationcontext 而不是 app
【问题讨论】:
标签: android kotlin dependency-injection dagger-2 dagger