Search code examples
androidkotlindependency-injectionkodein

How to fix Kodein Force close error in Android


WHY NOT HELP ME ANY PEOPLE???

In my application i used Kotin and Kodein for Dependency injection.
I write below codes, but when run application show me Force close error!

In my application i used Kotin and Kodein for Dependency injection.
I write below codes, but when run application show me Force close error!

Application class codes:

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

Activity class codes:

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

I initialize application class into Manifest

Error message :

 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)

Solution

  • In your application class you use QuotesViewModelFactory class, but into you activity class you use QuoteViewModelFactory class.
    This two classes is not match!
    Please check your classes and match this two classes !