提供Koin MVP的活动

问题描述 投票:0回答:1

我是Koin的新手(通常我正在使用Dagger),现在我无法使用MVP将我的View实例传递给Presenter。我去了一个NullPointer例外。如何将视图实例传递给我的Presenter?看起来Koin在View上传递null(在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)

主持人

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()
    }
}

视图

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)
        }
    }
}
android koin
1个回答
0
投票

试着改变

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

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

在活动中:

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

通过这个你提供一个观点作为一个论点,我相信,在这种情况下,这是一个理想的选择。

© www.soinside.com 2019 - 2024. All rights reserved.