如何修复Android中的Kodein Force关闭错误

时间:2019-06-29 05:36:06

标签: android kotlin dependency-injection kodein

为什么不帮助我任何人?

在我的应用程序中,我使用Kotin和 Kodein 进行了依赖项注入
我写下面的代码,但是当运行应用程序时,显示强制关闭错误!

在我的应用程序中,我使用Kotin和 Kodein 进行了依赖项注入
我写下面的代码,但是当运行应用程序时,显示强制关闭错误!

应用程序类代码:

class QuoteDiApp : Application(), KodeinAware {

    override val kodein = Kodein.lazy {
        bind<Database>() with singleton { DatabaseFakeImpl() }
        bind<QuoteDao>() with singleton { instance<Database>().quoteDao }
        bind<QuoteRepository>() with singleton { QuoteRepositoryImpl(instance()) }
        bind() from provider { QuotesViewModelFactory(instance()) }
    }
}

活动分类代码:

class QuoteDiActivity : AppCompatActivity(), KodeinAware {

    override val kodein by closestKodein()
    private val viewModelFactory: QuoteViewModelFactory by instance()

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

        initializeUi()
    }

    private fun initializeUi() {
        // Use ViewModelProviders class to create / get already created QuotesViewModel
        // for this view (activity)
        val viewModel = ViewModelProviders.of(this, viewModelFactory).get(QuoteViewModel::class.java)

        // Observing LiveData from the QuotesViewModel which in turn observes
        // LiveData from the repository, which observes LiveData from the DAO ☺
        viewModel.getQuotes().observe(this, Observer { quotes ->
            val stringBuilder = StringBuilder()
            quotes.forEach { quote ->
                stringBuilder.append("\n$quote")
            }
            textView_quotes.text = stringBuilder.toString()
        })

        // When button is clicked, instantiate a Quote and add it to DB through the ViewModel
        button_add_quote.setOnClickListener {
            val quote = Quote(editText_quote.text.toString(), editText_author.text.toString())
            viewModel.addQuote(quote)
            editText_quote.setText("")
            editText_author.setText("")
        }
    }
}

我将application类初始化为Manifest

错误消息:

 Caused by: org.kodein.di.Kodein$NotFoundException: No binding found for bind<QuoteViewModelFactory>() with ? { ? }
Registered in this Kodein container:
        bind<QuoteDao>() with singleton { QuoteDao }
        bind<QuotesViewModelFactory>() with provider { QuotesViewModelFactory }
        bind<Database>() with singleton { DatabaseFakeImpl }
        bind<QuoteRepository>() with singleton { QuoteRepositoryImpl }

    at org.kodein.di.internal.KodeinContainerImpl.factory(KodeinContainerImpl.kt:174)
    at org.kodein.di.KodeinContainer$DefaultImpls.factory$default(KodeinContainer.kt:33)
    at org.kodein.di.KodeinContainer$DefaultImpls.provider(KodeinContainer.kt:80)
    at org.kodein.di.internal.KodeinContainerImpl.provider(KodeinContainerImpl.kt:7)
    at org.kodein.di.KodeinContainer$DefaultImpls.provider$default(KodeinContainer.kt:79)
    at org.kodein.di.KodeinAwareKt$Instance$1.invoke(KodeinAware.kt:152)
    at org.kodein.di.KodeinProperty$provideDelegate$1.invoke(properties.kt:39)
    at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
    at nouri.mohammad.mvvm_kodeindi.with_di.ui.quotes.QuoteDiActivity.getViewModelFactory(QuoteDiActivity.kt)
    at nouri.mohammad.mvvm_kodeindi.with_di.ui.quotes.QuoteDiActivity.initializeUi(QuoteDiActivity.kt:30)
    at nouri.mohammad.mvvm_kodeindi.with_di.ui.quotes.QuoteDiActivity.onCreate(QuoteDiActivity.kt:24)
    at android.app.Activity.performCreate(Activity.java:5231)

1 个答案:

答案 0 :(得分:1)

在您的application类中,您使用 QuotesViewModelFactory 类,但在您的activity类中,您使用 QuoteViewModelFactory 类。
这两个班不匹配
请检查您的课程并匹配两个课程