Не удается создать экземпляр класса ViewModel kotlin - PullRequest
0 голосов
/ 23 мая 2018

Вот мой код

class BookmarkViewModel(app: Application) : AndroidViewModel(app) {

    private val dao = BookmarkDb.get(app).bookmarkDao()

    companion object {
        private const val PAGE_SIZE = PagingConstants.PERPAGE

        /**
         * If placeholders are enabled, PagedList will report the full size but some items might
         * be null in onBind method (PagedListAdapter triggers a rebind when data is loaded).
         * <p>
         * If placeholders are disabled, onBind will never receive null but as more pages are
         * loaded, the scrollbars will jitter as new pages are loaded. You should probably disable
         * scrollbars if you disable placeholders.
         */
        private const val ENABLE_PLACEHOLDERS = true
    }

        val allBookmarks = LivePagedListBuilder(dao.allBookmarkByDatetime(), PagedList.Config.Builder()
                    .setPageSize(PAGE_SIZE)
                    .setEnablePlaceholders(ENABLE_PLACEHOLDERS)
                    .build()).build()

    fun insert(title: String, description: String, datetime: String) = ioThread {
        dao.insert(Bookmark(id = 0, title = title, description = description, datetime = datetime))
    }

    fun remove(bookmark: Bookmark) = ioThread {
        dao.delete(bookmark)
    }
}

Это из примеров Google .. После того, как я хочу:

class BookmarkListFragment : FirstFragment() {

private var viewModel: BookmarkViewModel? = null
..

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        viewModel = ViewModelProviders.of(activity!!).get(BookmarkViewModel::class.java)
...

И вот проблема:

java.lang.RuntimeException: невозможно создать экземпляр класса com.lacas.db.room.BookmarkViewModel

Можно ли использовать это во фрагменте?

java.lang.RuntimeException: Невозможно запустить действие ComponentInfo {com.lacas.asd / com.lacas.asd.ui.activities.testtabs.TestTab2Activity}: java.lang.RuntimeException: Невозможно создать экземпляркласс com.lacas.asd.db.room.BookmarkViewModel в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2924) в android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2985) в android.app.ActivityThread.-wrap14 (ActivityThread.java) в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1635) в android.os.Handler.dispatchMessage (Handler.java:102) в android.os.Looper.loop (Looper.java): 154) на android.app.ActivityThread.main (ActivityThread.java:6692) на java.lang.reflect.Method.invoke (собственный метод) на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1468) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1358) Причина: java.lang.RuntimeException: не удается создать экземпляр класса com.lacas.asd.db.room.BookmarkViewModel в android.arch.lifecycle.ViewModelProvider $ AndroidViewModelFactory.crerovider View.java: 207) по адресу android.arch.lifecycle.ViewModelProvider.get (ViewModelProvider.java:134) по адресу android.arch.lifecycle.ViewModelProvider.get (ViewModelProvider.java:102) по адресу com.lacas.asd.ui.activities.testtabs.TestTab2Activity $ viewModel $ 2.invoke (TestTab2Activity.kt: 34) в com.lacas.asd.ui.activities.testtabs.TestTab2Activity $ viewModel $ 2.invoke (TestTab2Activity.kt: 29) в kotlin.UnsafeLazyImpl.kt: 154) на com.lacas.asd.ui.activities.testtabs.TestTab2Activity.getViewModel (TestTab2Activity.kt) на com.lacas.asd.ui.activities.testtabs.TestTab2Activity.onCreated (TestTab2Activity.kt: 45) в com.lacas.asd.base.BasePermissionsActivity.onCreate (BasePermissionsActivity.kt: 34) в android.app.Activity.performCreate (Activity.java:6912) в android.app.Instrumentation.callActivityOnCreate (Instrumentation).java: 1126) в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2877) в android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2985) в android.app.ActivityThread.-wrap14 (ActivityThread.java) вandroid.app.ActivityThread $ H.handleMessage (ActivityThread.java:1635) в android.os.Handler.dispatchMessage (Handler.java:102) в android.os.Looper.loop (Looper.java:154) в android.app.ActivityThread.main (ActivityThread.java:6692) в java.lang.reflect.Method.invoke (собственный метод) в com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1468) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1358) Вызывается: java.lang.reflect.InvocationTargetException в java.lang.reflect.Constructor.newInstance0 (собственный метод)по адресу java.lang.reflect.Constructor.newInstance (Constructor.java:430) по адресу android.arch.lifecycle.ViewModelProvider $ AndroidViewModelFactory.create (ViewModelProvider.java:199) по адресу android.arch.lifecycle.ViewModelProvider.rovr.jidel.j.jpg: 134) в android.arch.lifecycle.ViewModelProvider.get (ViewModelProvider.java:102) в com.lacas.asd.ui.activities.testtabs.TestTab2Activity $ viewModel $ 2.invoke (TestTab2Activity.kt: 34) в com.lacas.asd.ui.activities.testtabs.TestTab2Activity $ viewModel $ 2.invoke (TestTab2Activity.kt: 29) вkotlin.UnsafeLazyImpl.getValue (Lazy.kt: 154) на com.lacas.asd.ui.activities.testtabs.TestTab2Activity.getViewModel (TestTab2Activity.kt) на com.lacas.asd.ui.activities.testtabs.TestCab2ActivityTestTab2Activity.kt: 45) в com.lacas.asd.base.BasePermissionsActivity.onCreate (BasePermissionsActivity.kt: 34) в android.app.Activity.performCreate (Activity.java:6912) в android.app.Instrumentation.callActivityOnCreate (Инструментарий.java: 1126) в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2877) в android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2985) в android.app.ActivityThread.-wrap14 (ActivityThread.java) вandroid.app.ActivityThread $ H.handleMessage (ActivityThread.java:1635) в android.os.Handler.dispatchMessage (Handler.java:102) в android.os.Looper.loop (Looper.java:154) в android.app.ActivityThread.main (ActivityThread.java:6692) в java.lang.reflect.Method.invoke (собственный метод) в com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1468) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1358). Причина: java.lang.RuntimeException: не удается найти реализацию для com.lacas.asd.db.room.BookmarkDb.BookmarkDb_Impl не существует в android.arch.persistence.room.Room.getGeneratedImplementation (Room.java:93) в android.arch.persistence.room.RoomDatabase $ Builder.build (RoomDatabase.java:630) в com.lacas.asd.db.room.BookmarkDb $ Companion.get (BookmarkDb.kt: 29) в com.lacas.asd.db.room.BookmarkViewModel. (BookmarkViewModel.kt: 14) в java.lang.reflect.Constructor.newInstance0 (собственный метод) на java.lang.reflect.Constructor.newInstance (Constructor.java:430) на android.arch.lifecycle.ViewModelProvider $ AndroidViewModelFactory.create (ViewModelProvider.java:199) на android.arch.lifecycle.ViewModelProvider.rovM.Java: 134) на android.arch.lifecycle.ViewModelProvider.get (ViewModelProvider.java:102) на com.lacas.asd.ui.activities.testtabs.TestTab2Activity $ viewModel $ 2.invoke (TestTab2Activity.kt: 34) на ком.lacas.asd.ui.activities.testtabs.TestTab2Activity $ viewModel $ 2.invoke (TestTab2Activity.kt: 29) в kotlin.UnsafeLazyImpl.getValue (Lazy.kt: 154) в com.lacas.asd.ui.activities.testtabs.TestTab2Activity.getViewModel (TestTab2Activity.kt) по адресу com.lacas.asd.ui.activities.testtabs.TestTab2Activity.onCreated (TestTab2Activity.kt: 45) по адресу com.lacas.asd.base.BasePermissionsActivity.onCreate (BasePermissionsActivity).на android.app.Activity.performCreate (Activity.java:6912) на android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1126) на android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2877) на android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2985) в android.app.ActivityThread.-wrap14 (ActivityThread.java) в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1635) в android.os.Handler.dispatchMessage (Handler.java:102) в android.os.Looper.loop (Looper.java:154) в android.app.ActivityThread.main (ActivityThread.java:6692) в java.lang.reflect.Method.invoke (собственный метод)на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1468) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java: 1358)

Ответы [ 4 ]

0 голосов
/ 21 сентября 2018

Эти 3 вещи работали для меня:

  1. Добавление / сохранение в зависимостяхProcessor и Kapt зависимостей

annotationProcessor "android.arch.lifecycle:compiler:$lifecycle_version" kapt "android.arch.lifecycle:compiler:$lifecycle_version"

annotationProcessor "android.arch.persistence.room:compiler:$room_version" kapt "android.arch.persistence.room:compiler:$room_version"

Добавление apply plugin: 'kotlin-kapt' в начало build.gradle (приложение) и очистка проекта

Переустановка приложения

0 голосов
/ 23 мая 2018

Как кто-то сказал здесь:

Постоянная комната Android: AppDatabase_Impl не существует

решение было:

implementation "android.arch.lifecycle:extensions:$lifecycle_version"
kapt "android.arch.lifecycle:compiler:$lifecycle_version"

implementation "android.arch.persistence.room:runtime:$room_version"
kapt "android.arch.persistence.room:compiler:$room_version"

implementation "android.arch.paging:runtime:$paging_version"
0 голосов
/ 11 июля 2018

удалить капт "xxxx.xxx."если вы все еще используете это в своем gradle.build, так как он устарел и добавьте

apply plugin: 'kotlin-kapt'

в конце вашего gradle.build для модуля приложения.что исправило мою проблему в андроид студии 3.1

0 голосов
/ 23 мая 2018

Измените viewModel = ViewModelProviders.of(activity!!).get(BookmarkViewModel::class.java)

на viewModel = ViewModelProviders.of(this).get(BookmarkViewModel::class.java)

Кроме того, не создавайте экземпляры viewModel на null.Измените его на lateinit var таким образом, вам не нужно сразу создавать экземпляр (но вы говорите Kotlin, что вы создадите его экземпляр до доступа к нему).Вы можете сделать это следующим образом: private lateinit var viewModel: BookMarkViewModel

РЕДАКТИРОВАТЬ Корень проблемы заключался в том, что Room Dependencies, где либо не в той же версии или annotationProcessor, был использован вместо kapt (kapt требуется при использовании Kotlin)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...