Обеспечить деятельность в Коин MVP - PullRequest
0 голосов
/ 20 апреля 2019

Я новичок в Koin (обычно я использую Dagger), и сейчас я не могу передать свой экземпляр View в Presenter, используя MVP. Я пошел исключение NullPointer. Как передать экземпляр просмотра моему докладчику? Похоже, что Коин передает NULL в View (в Dagger я буду использовать contribActivityInjection

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
        at android.support.v7.app.AppCompatDelegateImpl.<init>(AppCompatDelegateImpl.java:249)
        at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:182)
        at android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:520)
        at android.support.v7.app.AppCompatActivity.findViewById(AppCompatActivity.java:191)
        at com.strangelove.dtfu.MainActivity._$_findCachedViewById(Unknown Source:25)
        at com.strangelove.dtfu.MainActivity.showText(MainActivity.kt:10)
        at com.strangelove.dtfu.MySimplePresenter.sayHelloFromActivity(MySimplePresenter.kt:7)
        at com.strangelove.dtfu.MainActivity.onCreate(MainActivity.kt:19)

Presenter

class MySimplePresenter(private val repo: HelloRepository, private val mainActivityView: MainActivityView) {
    fun sayHello() = "${repo.giveHello()} from $this"

    fun sayHelloFromActivity() {
        mainActivityView.showText(sayHello())
    }
}

Активность

class MainActivity : AppCompatActivity(), MainActivityView {
    override fun showText(text: String) {
        first_textView.text = firstPresenter.sayHello()
    }

    private val firstPresenter: MySimplePresenter by inject()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    override fun onStart() {
        super.onStart()
        firstPresenter.sayHelloFromActivity()
    }
}

View

interface MainActivityView {
    fun showText(text: String)
}

модули

val appModule = module {
    single<HelloRepository> {
        HelloRepositoryImpl()
    }

    factory {
        MySimplePresenter(get(), get())
    }
}

val activityModule = module {
    single<MainActivityView> {
        MainActivity()
    }
}

Применение:

class MyApplication: Application() {
    override fun onCreate() {
        super.onCreate()
        startKoin {
            androidLogger()
            androidContext(this@MyApplication)
            modules(appModule, activityModule)
        }
    }
}

1 Ответ

0 голосов
/ 25 апреля 2019

Попробуйте изменить

factory {
    MySimplePresenter(get(), get())
}

до

factory { (view: MainActivityView) ->
    MySimplePresenter(get(), view)
}

А в деятельности:

private val firstPresenter: MySimplePresenter by inject { parametersOf(this@MainActivity) }

Этим вы предоставляете представление в качестве аргумента, что, я считаю, желательно в этой ситуации.

...