Вид становится пустым после инжектора конструктора инъекций с кинжалом 2 - PullRequest
0 голосов
/ 28 июня 2019

Здравствуйте, я новичок в работе с кинжалом 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
}

1 Ответ

2 голосов
/ 28 июня 2019

Из того, что я вижу, ваш 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
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...