【问题标题】:Null Context when using Dagger 2使用 Dagger 2 时的空上下文
【发布时间】: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


    【解决方案1】:

    您应该了解更多有关 Dagger2 架构的信息。我邀请您使用我的 Dagger2 示例 project 示例应用程序来创建新的 Dagger2 应用程序。

    您不必在 Repository 类中将您的应用程序注册为 Dagger 应用程序。尝试在 BaseApplication 类中对其进行初始化,并使其成为清单中的应用程序类。

    顺便说一句,您需要上下文但返回“应用程序”,它是应用程序类。

    【讨论】:

    • 我实际上已经完成了这些部分。我将它们添加到我的帖子中。而且我已经尝试过 app.applicationContext 但这也不起作用
    • 错误的是你正在创建 class myRepository @Inject constructor(private val context: Context) : myContract.Repository { private fun inject() { DaggerAppComponent.builder() .application(myApp()) 。 appModule(AppModule(myApp())) .build().inject(this) } } this 在您的存储库类中。在您的应用程序类中执行此操作
    • 您能否提供一个示例,说明我将如何注入上下文,就像您在项目中所做的那样?
    • 与您在项目中所做的方式相同,但使用 app.context
    猜你喜欢
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多