Как исправить ошибку закрытия Kodein Force в Android - PullRequest
0 голосов
/ 29 июня 2019

ПОЧЕМУ НЕ ПОМОГАЕТ МНЕ ЛЮДЯМ ???

В моем приложении я использовал Котин и Кодеин для Инъекция зависимости .
Я пишу ниже коды, но при запуске приложения покажи мне ошибку принудительного закрытия!

В моем приложении я использовал 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 Ответ

1 голос
/ 29 июня 2019

В вашем application классе вы используете QuotesViewModelFactory класс, но в вашем activity классе вы используете QuoteViewModelFactory класс.
Эти два класса не совпадают!
Пожалуйста, проверьте ваши классы и соответствует это два класса !

...