代码之家  ›  专栏  ›  技术社区  ›  lacas

无法创建类ViewModel Kotlin的实例

  •  3
  • lacas  · 技术社区  · 8 年前

    这是我的密码

    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:无法启动activity componentinfo com.lacas.asd/com.lacas.asd.ui.activities.testtabs.testtab2activity:java.lang.runtimeexception:无法创建类com.lacas.asd.db.room.bookmarkviewmodel的实例 在安卓.App.ActuviyTrime.PrimeRunCycActudio(AccviyTyth.java:2924) 在安卓.App.ActuviyToel.HuffelaLuncActudio(ActuviyToel.java:2985) 在安卓.App.ActuviyTrime.WrAP14(ActuviyTo.java) 在安卓.App.ActuviyT线$ H.HuffLeMeSeX(ActuviyTrim.java:1635) 在安卓.OS.Halder-Debug消息(HANDL.java:102) 在安卓.OS.Looper-Loo.(循环器.java:154) 在Addio.App.ActuviyTrime.Mead(ActuviyToel.java:6692) 在java. 在COM.Android .No.OS.ZyGoTynIt方法和AdjSculal.Run(ZyGoTynIt.java:1468) 在COM.Android .No.OS.ZyGoTyIn.Mault(ZyGoTynIt.java:1358) 原因:java.lang.runtimeexception:无法创建类com.lacas.asd.db.room.bookmarkviewmodel的实例 在Android .ARC.LIFECKEYVIEW .VIEW模型提供者$ANDROIDVIEW模型工厂.CREATE(VIEW建模提供者.java:207) 在Android .ARC.LIFECKEYVIEW .VIEW模型提供程序.GET(VIEWMPLATIONPROSP.java:134) 在Android .ARC.LIFECKEYVIEW .VIEW模型提供程序.GET(VIEWMPLATIONPROSP.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.unsfelazyimpl.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.kt:34) 在Android .App.Activity中。PrimeCube(Activity .java:6912) 在安卓.App.Test.CalActhVyyOnCuto(To仪,Java:1126) 在安卓.App.ActuviyTrime.PrimeRunCycActudio(AccviyTyth.java:2877) 在安卓.App.ActuviyToel.HuffelaLuncActudio(ActuviyToel.java:2985) 在Android上 在安卓.App.ActuviyT线$ H.HuffLeMeSeX(ActuviyTrim.java:1635) 在安卓.OS.Halder-Debug消息(HANDL.java:102) 在安卓.OS.Looper-Loor(Looper-Java:154)中 在Addio.App.ActuviyTrime.Mead(ActuviyToel.java:6692) 在java. 在COM.Android .No.OS.ZyGoTynIt方法和AdjSculal.Run(ZyGoTynIt.java:1468) 在COM.Android .No.OS.ZyGoTyIn.Mault(ZyGoTynIt.java:1358) 原因:java.lang.reflect.invocationTargetException 在Java.Lang.Exrime.构造函数.NeWistStase0(原生方法) 在Java构造函数中(构造函数:430) 在Android .ARC.LIFECKEYVIEW .VIEW模型提供者$ANDROIDVIEW模型工厂.CREATE(VIEW建模提供者.java:199) 在Android .ARC.LIFECKEYVIEW .VIEW模型提供程序.GET(VIEWMPLATIONPROSP.java:134) 在Android .ARC.LIFECKEYVIEW .VIEW模型提供程序.GET(VIEWMPLATIONPROSP.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.unsfelazyimpl.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.kt:34)上 在Android .App.Activity中。PrimeCube(Activity .java:6912) 在安卓.App.Test.CalActhVyyOnCuto(To仪,Java:1126) 在安卓.App.ActuviyTrime.PrimeRunCycActudio(AccviyTyth.java:2877) 在安卓.App.ActuviyTrn.HuffelaLuncActudio(AccviyTyth.java:2985) 在Android上 在安卓.App.ActuviyT线$ H.HuffLeMeSeX(ActuviyTrim.java:1635) 在Android .OS.HANDL.Debug ChrimeMead(处理程序. Java:102) 在安卓.OS.Looper-Loo.(循环器.java:154) 在Addio.App.ActuviyTrime.Mead(ActuviyToel.java:6692) 在java. 在COM.Android .No.OS.ZyGoTynIt方法和AdjSculal.Run(ZyGoTynIt.java:1468) 在COM.Android .No.OS.ZyGoTeNIT.MUN(ZyGoTynIt.java:1358) 原因:java.lang.runtimeexception:找不到com.lacas.asd.db.room.bookmarkdb的实现。bookmarkdb_impl不存在 在安卓.ARC.持久性.房间. GoGeDeaTimeDimPrimEngress(Hoo.java:93) 在Android .ARC.持久性.Roo.RoMask$Builder .Build(RooDavaDistabase. Java:630) 在com.lacas.asd.db.room.bookmarkdb$companion.get(bookmarkdb.kt:29) 在com.lacas.asd.db.room.bookmarkviewmodel上。(bookmarkviewmodel.kt:14) 在Java.Lang.Exrime.构造函数.NeWistStase0(原生方法) 在Java构造函数中(构造函数:430) 在安卓.ARC.LIFECYROCKE.VIEW模型提供者$ANDROIDVIEW模型工厂.CREATE(VIEWMODMASPORDION.JAVA:199) 在Android .ARC.LIFECKEYVIEW .VIEW模型提供程序.GET(VIEWMPLATIONPROSP.java:134) 在Android .ARC.LIFECKEYVIEW .VIEW模型提供程序.GET(VIEWMPLATIONPROSP.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.unsfelazyimpl.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.kt:34)上 在Android .App.Activity中。PrimeCube(Activity .java:6912) 在安卓.App.Test.CalActhVyyOnCuto(To仪,Java:1126) 在安卓.App.ActuviyTrime.PrPrimeRunCycActudio(AccviyTyth.java:2877) 在安卓.App.ActuviyTrn.HuffelaLuncActudio(AccviyTyth.java:2985) 在安卓.App.ActuviyTrime.WrAP14(ActuviyTo.java) 在安卓.App.ActuviyT线$ H.HoalMeMeSeX(ActuviyTrim.java:1635) 在Android .OS.HANDL.Debug ChrimeMead(处理程序. Java:102) 在安卓.OS.Looper-Loo.(循环器.java:154) 在Addio.App.ActuviyTrime.Mead(ActuviyToel.java:6692) 在java. 在COM.Android .No.OS.ZyGoTynIt方法和AdjSculal.Run(ZyGoTynIt.java:1468) 在COM.Android .No.OS.ZyGoTyIn.Mault(ZyGoTynIt.java:1358)

    4 回复  |  直到 8 年前
        1
  •  9
  •   lacas    8 年前

    正如有人在这里所说:

    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"
    
        2
  •  4
  •   Rene Ferrari    8 年前

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

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

    此外,不要实例化 viewModel null . 把它改成 lateinit var 这样你就不必立即实例化(但是你要告诉科特林你 在访问它之前先实例化它)。您可以这样做: private lateinit var viewModel: BookMarkViewModel

    编辑 问题的根源在于 Room Dependencies 如果不是在同一版本上,或者 annotationProcessor 被用来代替 kapt ( 小精灵 使用Kotlin时需要)

        3
  •  2
  •   Jamal S Yi Yang    7 年前

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

    apply plugin: 'kotlin-kapt'
    

    在应用程序模块的gradle.build结束时。 在Android Studio 3.1中解决了我的问题

        4
  •  2
  •   nb2998    7 年前

    这三件事对我很有用:

    1. 在依赖项中添加/保留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"

    1. 添加 apply plugin: 'kotlin-kapt' 在build.gradle(app)和cleaning项目的顶部

    2. 重新安装应用程序