首页 文章

无法创建ViewModel类的实例kotlin

提问于
浏览
2

这是我的代码

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

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

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的实例 . 位于android.app.A活动中的android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2924)的asd.db.room.BookmarkViewModel,android.app.ActivityThread.-wrap14(ActivityThread.java)的android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2985) )android.app.A活动上的Android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1635)android.os.Looper.loop(Handler.java:102)android.os.Looper.loop(Looper.java:154) .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的实例在Android.arch.lifecycle.ViewModelProvider.get上的android.arch.lifecycle.ViewModelProvider $ AndroidViewModelFactory.create(ViewModelProvider.java:207)android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:134)(ViewModelProvider.java) :102)at com.lacas.asd.ui.activities.testtabs.TestTab2Activity $ viewModel $ 2.invoke(TestTab2Activity.kt:34)at com.lacas.asd.ui.activities.testtabs.TestTab2Activity $ viewModel $ 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) .Instrumentation.callActivityOnCreate(Instrumentation.java:1126)在Android.app的android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2877) .ActivityThread.handleLaunchActivity(ActivityThread.java:2985)位于android.app.Handler.dispatchMessage上android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1635)的android.app.ActivityThread.-wrap14(ActivityThread.java) (Handler.java:102)在android.app.Looper.loop(Looper.java:154)的android.app.ActivityThread.main(ActivityThread.java:6692)java.lang.reflect.Method.invoke(Native Method) )com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1468)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)引起:java.lang.reflect . java.lang.reflect.Constructor.newInstance0(本机方法)中的java.lang.reflect.Constructor.newInstance0(Native Method)位于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.la cas.asd.ui.activities.testtabs.TestTab2Activity $ viewModel $ 2.invoke(TestTab2Activity.kt:34)at com.lacas.asd.ui.activities.testtabs.TestTab2Activity $ viewModel $ 2.invoke(TestTab2Activity.kt:29)at at kotlin.UnsafeLazyImpl.getValue(Lazy.kt:154)位于com.lacas.asd.ui.activs.test.TestTab2Activity.onCreated的com.lacas.asd.ui.activities.testtabs.TestTab2Activity.getViewModel(TestTab2Activity.kt)中( 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.handleLaunchActivity(ActivityThread.java:2985)的android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2877)在android.app.ActivityThread.-wrap14(ActivityThread.java)at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1635)android.os.Handler.dispatchMessage(Handler.java:102)android.os.L位于android.app.ActivityThread.main(ActivityThread.java:6692)的ooper.loop(Looper.java:154)位于com.android.internal.os.ZygoteInit $的java.lang.reflect.Method.invoke(Native Method)在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)中的MethodAndArgsCaller.run(ZygoteInit.java:1468)引起: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)atcom.lacas.asd.db.room.BookmarkViewModel . (BookmarkViewModel.kt:14)at java.lang.reflect.Constructor.newInstance0(Native Method)at java.lang.reflect.Constructor.newInstance(Constructor.java:430)在Android.arch.lifecycle.ViewModelProvider.get上的android.arch.lifecycle.ViewModelProvider $ AndroidViewModelFactory.create(ViewModelProvider.java:199)android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:134)(ViewModelProvider.java) :102)at com.lacas.asd.ui.activities.testtabs.TestTab2Activity $ viewModel $ 2.invoke(TestTab2Activity.kt:34)at com.lacas.asd.ui.activities.testtabs.TestTab2Activity $ viewModel $ 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.Activity.performCreat的com.lacas.asd.base.BasePermissionsActivity.onCreate(BasePermissionsActivity.kt:34) e(Activity.java:6912)位于android.app.ActivityThread.perleLaunchActivity(ActivityThread.java:2877)的android.app.Instrumentation.callActivityCnate(Instrumentation.java:1126)android.app.ActivityThread.handleLaunchActivity(ActivityThread.java) :2985)在Android.app.Handler.dispatchMessage(Handler.java:102)的android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1635)的android.app.ActivityThread.-wrap14(ActivityThread.java)处android.os.Looper.loop(Looper.java:154)位于com.android.internal的java.lang.reflect.Method.invoke(Native Method)的android.app.ActivityThread.main(ActivityThread.java:6692) . os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1468)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)

4 回答

  • 1

    有人在这里说:

    Android room persistent: AppDatabase_Impl does not exist

    解决方案是:

    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"
    
  • 7

    改变 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

    EDIT 问题的根源是 Room Dependencies ,其中不使用相同版本或使用 annotationProcessor 而不是 kapt (使用Kotlin时需要 kapt

  • 3

    删除kapt“xxxx.xxx” . 如果您仍然在gradle.build中使用它,因为它已被弃用并添加

    apply plugin: 'kotlin-kapt'
    

    在你的gradle.build结束时为app模块 . 修复了android studio 3.1中的问题

  • 0

    这3件事对我有用:

    • 在依赖项中添加/保留annotationProcessor和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"

    • 在build.gradle(app)的顶部添加 apply plugin: 'kotlin-kapt' 并清理项目

    • 重新安装应用程序

相关问题