【问题标题】:View become null after inject constructor presenter with dagger 2使用匕首 2 注入构造函数演示者后视图变为空
【发布时间】:2019-06-28 07:11:08
【问题描述】:

你好,我是 dagger 2 的新手。当我运行下面的代码时,我得到了:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference

Unable to start activity ComponentInfo{com.ali.daggerplayground/com.ali.daggerplayground.main.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference

当我不使用匕首时,这段代码运行良好。我不明白是什么让视图变为空。也许有人可以给我解释一下?

这是我的活动。

class MainActivity : BaseActivity(), MainContract.View {

@Inject
internal lateinit var mPresenter: MainContract.Presenter

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    App.main.inject(this)
    tv.text = "This Button"
    mPresenter.attach(this)
    mPresenter.getImage()
}

override fun onSuccess(message: String?) {
    Log.i("MessageReturn", message)
    tv.text = message
}

这是我的主持人:

class MainPresenter @Inject constructor(private val mView: MainContract.View) :
    MainContract.Presenter {

override fun attach(view: MainContract.View) {

}

override fun getImage() {
    mView.onSuccess("success")
}

这是我的模块:

@Module
class ModuleMain {

@Provides
@Singleton
fun provideMainPresenter(mainView: MainContract.View): MainContract.Presenter {
    return MainPresenter(mainView)
}

@Provides
@Singleton
fun provideMainView(): MainContract.View {
    return MainActivity()
}

这个组件:

@Singleton
@Component(modules = [ModuleMain::class, ModuleNetwork::class])
interface ComponentMain {

fun inject(mainActivity: MainActivity)

@Component.Builder
interface Builder {

    @BindsInstance
    fun application(application: Application): Builder

    fun moduleNetwork(moduleNetwork: ModuleNetwork): Builder
    fun build(): ComponentMain
}

【问题讨论】:

  • 为什么你的 MainPresenter 是单身人士,而 MainView 不是?
  • 我只是添加了@Singleton,但仍然崩溃。

标签: android retrofit2 dagger-2 android-mvp


【解决方案1】:

据我所知,您的 ModuleMain 不正确,因为您不应该在该模块中提供您的视图,请像这样更改它

@Module
class ModuleMain {

  @Provides
  @Singleton
  fun provideMainPresenter(): MainContract.Presenter {
    return MainPresenter()
  }
}

当然,MainPresenter 应该是这样的

class MainPresenter @Inject constructor() :
    MainContract.Presenter {

  override fun attach(view: MainContract.View) {
    mView = view
  }
}

【讨论】:

  • 我不能只注入使用构造函数吗?
  • 不,你不应该,因为你不能像MainActivity()这样创建一个Activity,一个Activity需要通过Intent等来创建
  • 这就是为什么你在Activity 中看到的原因,你有这行来设置视图mPresenter.attach(this)
  • 是否可以不使用presenter.attach()?
  • 如果你要在 MainPresenter 中注入 MainView,在 MainView 中注入 MainPresenter。这将是循环图,而匕首不会那样做。 DAG->有向无环图
猜你喜欢
  • 2017-11-29
  • 1970-01-01
  • 2015-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-20
相关资源
最近更新 更多