无法创建ViewModel类的实例kotlin

lac*_*cas 4 android kotlin

这是我的代码

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

这是来自谷歌样本..我想:

class BookmarkListFragment : FirstFragment() {

private var viewModel: BookmarkViewModel? = null
..

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

        viewModel = ViewModelProviders.of(activity!!).get(BookmarkViewModel::class.java)
...
Run Code Online (Sandbox Code Playgroud)

这是问题所在:

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.A.运行时android.O.Roper.loop(Looper.java:154)的android.app.A.运行时,Android.app.A活动线程中的android.app.A活动线程(运动转发代码:1024)处于android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1635) app.ActivityThread.main(ActivityThread.java:6692)at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1468)at com的java.lang.reflect.Method.invoke(Native Method). android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)引起:java.lang.RuntimeException:无法创建类com.lacas.asd.db.room.BookmarkViewModel a的实例 牛逼android.arch.lifecycle.ViewModelProvider $ AndroidViewModelFactory.create(ViewModelProvider.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 $ $视图模型2.invoke(TestTab2Activity.kt:在com.lacas.asd.ui.activities.testtabs.TestTab2Activity $ $视图模型34 2.invoke)(TestTab2Activity .kt:29)在com.lacas.asd.ui.activ.activities的com.lacas.asd.ui.activities.testtabs.TestTab2Activity.getViewModel(TestTab2Activity.kt)的kotlin.UnsafeLazyImpl.getValue(Lazy.kt:154). testtabs.TestTab2Activity.onCreated(TestTab2Activity.kt:45)位于android.app的android.app.Activity.performCreate(Activity.java:6912)的com.lacas.asd.base.BasePermissionsActivity.onCreate(BasePermissionsActivity.kt:34) android.app.A的android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2877)上的.Intrutrumentation.callActivityOnCreate(Instrumentation.java:1126)ctivityThread.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.app.Looper.loop(Looper.java:154)的android.app.ActivityThread.main(ActivityThread.java:6692)at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1468)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)引起:java.lang.reflect.InvocationTargetException at java.lang.reflect.Constructor.newInstance0(Native Method)at java.lang.reflect.Constructor.newInstance(Constructor.java:430)at android.arch.lifecycle.ViewModelProvider $ AndroidViewModelFactory.create(ViewModelProvider.java:199)在android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:134)在com.laca的android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:102)s.asd.ui.activities.testtabs.TestTab2Activity $ $视图模型2.invoke(TestTab2Activity.kt:34)在com.lacas.asd.ui.activities.testtabs.TestTab2Activity $ $视图模型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)在android.app.Instrumentation.callActivityOnCreate(Instrumentation)的android.app.Activity.performCreate(Activity.java:6912)的com.lacas.asd.base.BasePermissionsActivity.onCreate(BasePermissionsActivity.kt:34)中的.java:1126)在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2877)在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2985)在android.app.ActivityThread.-wrap14(ActivityThread.java)在Android.app.Loo上的android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1635)位于android.os.Loo的android.os.Handler.dispatchMessage(Handler.java:102)per.loop(Looper.java:154)位于android.app.ActivityThread.main(ActivityThread.java:6692)的java.lang.reflect.Method.invoke(Native Method)at 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)at com.lacas.asd.db.room.BookmarkViewModel.(BookmarkViewModel.kt:14)at java.lang.reflect.Constructor.newInstance0(Native Method) )在java.lang.reflect.Constructor.newInstance(Constructor.java:430)在android.arch.lifecycle.ViewModelProvider $ AndroidViewModelFactory.create(ViewModelProvider.java:199)在android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider. Java的:134)在android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:102)在com.lacas.asd.ui.activities.testtabs.TestTab2Activity $视图模型$ 2.invoke(TestTab2Activity.kt:在COM 34). lacas.asd.ui.activities.testtabs.TestTab2Activity $ viewModel $ 2.invoke(TestTab2Activity.kt:29)at kotlin.UnsafeLazyImpl.getValue(Lazy.kt:154)at 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.A活动中的android.app.Anstrumentation.callActivityOnCreate(Instrumentation.java:1126)上的android.app.Activity.performCreate(Activity.java:6912)上的android.app.A活动时,我发现它是android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2877). 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.app.Looper.loop(Looper.java:154)的android.app.ActivityThread.main(ActivityThread.java:6692)at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1468)at com.android.internal.os.ZygoteInit.main(ZygoteInit.j)AVA:1358) 

lac*_*cas 10

有人在这里说:

Android room persistent: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"
Run Code Online (Sandbox Code Playgroud)

  • 在最新版本的 Android Studio 中,添加 `kapt` 会导致构建错误:“原因:应用程序:不推荐使用原始 kapt。” 所以你需要将 `apply plugin: 'kotlin-kapt'` 添加到你的 build.gradle 中。 (2认同)

Ren*_*ari 5

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

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

此外,不要实例化viewModelto null。将其更改为lateinit var这样您不必立即实例化(但您告诉 Kotlin 您在访问它之前实例化它)。你可以这样做:private lateinit var viewModel: BookMarkViewModel

编辑问题的根源在于Room Dependencieswhere 要么不在同一版本上,要么annotationProcessor被用来代替kapt(kapt使用 Kotlin 时需要)

  • 因为您正在使用 Kotlin。在 Room 的依赖项中,您是否使用了 `kapt` 而不是 `annotationProcessor`,并且所有的 Room 依赖项都具有相同的版本吗?如果没有更改并重试。如果它仍然不起作用,如果您能向我提供您的数据库创建代码,我会非常高兴,因为错误可能就在那里。 (2认同)