找不到DefaultActivityViewModelFactory

69
2.33-beta版本迁移到2.35版本后,我的项目停止了构建,并显示以下错误:

enter image description here

一个txt版本:
error: cannot access DefaultActivityViewModelFactory    
  class file for dagger.hilt.android.internal.lifecycle.DefaultActivityViewModelFactory not found   
  Consult the following stack trace for details.    
  com.sun.tools.javac.code.Symbol$CompletionFailure: class file for dagger.hilt.android.internal.lifecycle.DefaultActivityViewModelFactory not found

我的build.gradle(项目)的一小部分代码:
buildscript {
    ext.hilt_version = '2.33-beta'
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:4.1.3'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.32"
        ...
        classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version"
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        maven { url 'https://jitpack.io' }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

我的 build.gradle(app)的片段:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-parcelize'
apply plugin: 'kotlin-kapt'
apply plugin: 'dagger.hilt.android.plugin'

android {
    compileSdkVersion 29
    ...

    defaultConfig {
        javaCompileOptions {
            annotationProcessorOptions {
                arguments += [
                        "room.schemaLocation": "$projectDir/schemas".toString(),
                        "room.incremental"   : "true"
                ]
            }
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    testOptions {
        execution 'ANDROIDX_TEST_ORCHESTRATOR'
    }

    buildFeatures {
        viewBinding true
        dataBinding true
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    ...

    //DI
    implementation "com.google.dagger:hilt-android:$hilt_version"
    implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03"
    implementation 'androidx.hilt:hilt-work:1.0.0-beta01'
    kapt "com.google.dagger:hilt-compiler:$hilt_version"
    kapt "com.google.dagger:hilt-android-compiler:$hilt_version"
    kapt 'androidx.hilt:hilt-compiler:1.0.0-beta01'

    // INSTRUMENTED TESTS
    ...
    androidTestImplementation "com.google.dagger:hilt-android-testing:$hilt_version"
    kaptAndroidTest "com.google.dagger:hilt-android-compiler:$hilt_version"
    androidTestImplementation "androidx.work:work-testing:2.5.0"

    //KOTLIN
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.32"

    //LIFECYCLE
    implementation 'androidx.lifecycle:lifecycle-common-java8:2.3.1'
    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
    implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.1'

    // WORK MANAGER
    implementation "androidx.work:work-runtime-ktx:2.5.0"
}

如何解决这个问题?

1
使用 Hilt,您可以在不使用工厂的情况下初始化 ViewModel。您能展示一下您的 ViewModel 代码吗? - ameencarpenter
18
我遇到了同样的问题。移除这个导入似乎已经解决了问题,即 implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03' - Rafsanjani
3
@Rafsanjani 非常感谢。你是对的。androidx.hilt:hilt-lifecycle-viewmodel 依赖是问题所在。在 beta 版本中它也是多余的。请随意编写答案 ;) - Patryk Kubiak
1
@Rafsanjani 非常感谢。我遇到了一个稍微不同的错误,它是这样的:“无法处理my.packages.SingletonC”,但它还提到了DefaultActivityViewModelFactory,而我甚至还没有任何使用它们的ViewModels或UI(正在重写应用程序,只有数据层、repo和部分DI设置)。注释掉那个lifecycle-viewmodel依赖项就解决了问题。 - clamum
4个回答

247
从Hilt的较新版本开始,不再需要依赖hilt-lifecycle-viewmodel,因此删除应用级别build.gradle文件中的以下行即可消除错误。请注意保留HTML标记。

如果您有如下依赖,请从您的应用级别build.gradle文件中删除该行:

implementation 'androidx.hilt:hilt-lifecycle-viewmodel:x.x.x'


1
我去掉了一个错误,但是当我添加了ViewModelScoped的viewmodel依赖时,它会抛出错误,例如错误:[Dagger/MissingBinding] com.example.smartbilling.ui.login.LoginViewModel不能在没有@Inject构造函数或@Provides注释方法的情况下提供。 public abstract static class SingletonC implements BaseApplication_GeneratedInjector, ^ - Akash kumar
2
@Akashkumar 这里的文档可能对你有所帮助。它基本上展示了使用 ViewModelScope 的推荐方式。https://dagger.dev/hilt/view-model.html - Rafsanjani
@Rafsanjani,谢谢!在删除这个库之后,我不得不修复错误:incompatible types: NonExistentClass cannot be converted to Annotation。你提供的 ViewModel 链接对我很有帮助。 - CoolMind
在 Google/Dagger 的发布说明中没有找到这个,还是我们漏看了什么?顺便说一下,非常感谢你,你救了我们的一天! - mochadwi
这对我没有解决?! - mobibob
是的,这解决了我的问题,请访问安卓开发者网站获取最新更新,我当时使用的是 Hilt 版本 2.44。 - Kashinath

16

移除下面被弃用的依赖项:

implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03"

(自dagger-2.34版本起已被弃用)

证明: https://github.com/google/dagger/releases/tag/dagger-2.34

此外,请尝试升级您的生命周期版本如下:

def lifecycle_version = "2.5.1"

请在build.gradle(app)的依赖关系部分之后添加以下代码行:

kapt {
  correctErrorTypes true
}

遵循官方文档:

https://developer.android.com/training/dependency-injection/hilt-android

https://dagger.dev/hilt/view-model.html

https://github.com/google/dagger/releases


8
在你的 Build.gradle (:app) 文件中,删除这一行。
implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03"

你的ViewModel应该使用@HiltViewModel&@Inject而不是@ViewModelInject

@HiltViewModel
class MainViewModel @Inject constructor() : ViewModel() { }

0

一些依赖已被弃用。因此,您可以按照以下方式修改build.gradle (:app)和项目级别的build.gradle

此外,您可以在使用 Hilt 进行依赖注入官方源中查找更多信息。

build.gradle (:app)

plugins{
   ...
   id 'dagger.hilt.android.plugin'
   id 'kotlin-kapt'
}

dependencies {
   ...
   // Dagger Hilt
   implementation("com.google.dagger:hilt-android:2.44.2")
   kapt("com.google.dagger:hilt-android-compiler:2.44.2")
}

kapt {
   correctErrorTypes true
}

build.gradle(项目根目录)

plugins {
  ...
  id("com.google.dagger.hilt.android") version "2.44" apply false
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接