未解决的对视图模型的引用

Posted

技术标签:

【中文标题】未解决的对视图模型的引用【英文标题】:Unresolved reference to view model 【发布时间】:2021-10-18 12:42:07 【问题描述】:

我的视图模型类的导入语句存在一些问题。如果我在导致错误的两个 ViewModel 及其依赖项中清理或添加一行,我可以再次成功构建。但是,如果我更改了我的活动/片段中的任何内容并尝试在不清理的情况下重新构建,则会在我注入的一组视图模型上给我“未解决的参考”。

我在我的 gradle 文件中尝试了各种不同的配置,但无济于事。 我尝试了不同的 android studio 版本、不同的 Hilt 版本、Kotlin 版本。使缓存无效,重新启动和其他一切。请有人帮助我!

我已尝试将我的配置以及我的 MainActivity 导入语句和未解析引用所指的视图模型之一粘贴到下面。

主要活动


import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity

import androidx.navigation.NavController
import com.fauna.fauna.appointments.AppointmentsViewModel
import com.fauna.fauna.clinic.ClinicViewModel
import com.fauna.fauna.databinding.ActivityMainBinding
import com.fauna.fauna.dischargeNotes.DischargeNotesViewModel
import com.fauna.fauna.vaccinationCards.VaccinationCardsViewModel
import com.fauna.fauna.updateApp.UpdateAppDialogFragment
import com.fauna.fauna.user.UserViewModel
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class MainActivity : AppCompatActivity(), CoroutineScope  

    private val vaccinationCardsViewModel: VaccinationCardsViewModel by viewModels()

    //Some functionality 
 

疫苗接种卡视图模型



import androidx.lifecycle.viewModelScope
import com.fauna.fauna.fragment.VaccinationCardDetail
import com.fauna.fauna.util.NotificationService
import com.fauna.fauna.util.Result
import com.fauna.fauna.util.SnackBarViewModel
import com.fauna.fauna.util.getSeconds
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.channels.ConflatedBroadcastChannel
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch
import javax.inject.Inject

@HiltViewModel
class VaccinationCardsViewModel @Inject constructor(
    private val vaccinationCardsRepository: VaccinationCardsRepository,
    private val notificationService: NotificationService
) : SnackBarViewModel()  //Some functionality 

build.gradle 文件

buildscript 
    ext.kotlin_version = '1.5.21'
    ext.apollo_version = '2.5.5'
    ext.hilt_version = '2.37'
    def nav_version = '2.3.2'
    repositories 
        google()
        mavenCentral()

    
    dependencies 
        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
        classpath 'com.android.tools.build:gradle:7.0.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version"

    


allprojects 
    repositories 
        google()
        mavenCentral()
    


task clean(type: Delete) 
    delete rootProject.buildDir

build.gradle 应用文件

    id("com.android.application")
    id("kotlin-android")
    id("com.apollographql.apollo").version("$apollo_version")
    id("androidx.navigation.safeargs.kotlin")
    id("kotlin-kapt")
    id("dagger.hilt.android.plugin")
    id('com.google.gms.google-services')
    id('com.google.firebase.crashlytics')


android 
    signingConfigs 
        debugConfig 
            //..omittet..
        
    
    compileOptions 
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    
    compileSdkVersion 30
    buildToolsVersion "29.0.3"
    defaultConfig 
        applicationId "com.fauna.fauna"
        minSdkVersion 23
        targetSdkVersion 30
        versionCode 15
        versionName "0.8"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
    

    lintOptions 
        abortOnError false
    

    buildFeatures 
        viewBinding true
    
    buildTypes 
        //..Omittet..

    
    compileOptions 
        // Flag to enable support for the new language APIs
        coreLibraryDesugaringEnabled true
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    
    kotlinOptions 
        jvmTarget = '1.8'
    


dependencies 
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.3.1'
    implementation 'androidx.core:core-ktx:1.6.0'
    implementation 'com.google.android.material:material:1.4.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.0'

    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'

    def nav_version = "2.3.5"
    implementation "androidx.navigation:navigation-runtime-ktx:$nav_version"
    implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
    implementation "androidx.navigation:navigation-ui-ktx:$nav_version"

    // Feature module Support
    implementation "androidx.navigation:navigation-dynamic-features-fragment:$nav_version"

    // Testing Navigation
    androidTestImplementation "androidx.navigation:navigation-testing:$nav_version"

    // Jetpack Compose Integration
    implementation "androidx.navigation:navigation-compose:2.4.0-alpha06"
    implementation "androidx.security:security-crypto:1.1.0-alpha03"

    testImplementation 'junit:junit:4.13.1'
    androidTestImplementation 'androidx.test:runner:1.4.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'

    //View model
    implementation "androidx.activity:activity-ktx:1.3.1"
    implementation "androidx.fragment:fragment-ktx:1.3.6"

    // Hilt
    implementation "com.google.dagger:hilt-android:$hilt_version"
    kapt "com.google.dagger:hilt-android-compiler:$hilt_version"


kapt 
    correctErrorTypes = true


hilt 
    enableExperimentalClasspathAggregation = true


apollo 
    generateKotlinModels.set(true)


beforeEvaluate 
    getApiKey()


def getSecretKey(string) 
    def keysFile = file("secret.properties")
    def keysProperties = new Properties()
    keysProperties.load(new FileInputStream(keysFile))
    def key = keysProperties[string]
    println "key: " + key
    return key


apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.google.firebase.crashlytics' 

构建项目时不清理时出错:

Task :app:compileDevKotlin

e: /main/java/com/fauna/fauna/MainActivity.kt: (19, 41): Unresolved reference: VaccinationCardsViewModel

e: /main/java/com/fauna/fauna/MainActivity.kt: (21, 29): Unresolved reference: UserViewModel

e: /main/java/com/fauna/fauna/MainActivity.kt: (47, 44): Unresolved reference: VaccinationCardsViewModel

e: /main/java/com/fauna/fauna/MainActivity.kt: (47, 73): Not enough information to infer type variable VM

e: /main/java/com/fauna/fauna/MainActivity.kt: (47, 73): Property delegate must have a 'getValue(MainActivity, KProperty<*>)' method. None of the following functions is suitable: 
public inline operator fun <T> Lazy<???>.getValue(thisRef: Any?, property: KProperty<*>): ??? defined in kotlin

e: /main/java/com/fauna/fauna/MainActivity.kt: (49, 32): Unresolved reference: UserViewModel

e: /main/java/com/fauna/fauna/MainActivity.kt: (49, 49): Not enough information to infer type variable VM

e: /main/java/com/fauna/fauna/MainActivity.kt: (49, 49): Property delegate must have a 'getValue(MainActivity, KProperty<*>)' method. None of the following functions is suitable: 
public inline operator fun <T> Lazy<???>.getValue(thisRef: Any?, property: KProperty<*>): ??? defined in kotlin

e: /main/java/com/fauna/fauna/MainActivity.kt: (175, 93): Unresolved reference: it

【问题讨论】:

有关如何解决问题的更多说明。我在 apollo-android 项目页面上问了一个问题,包括重现github.com/apollographql/apollo-android/issues/3306 的步骤在解决问题之前,我创建了一个匕首问题github.com/google/dagger/issues/2799 【参考方案1】:

您好,您的刀柄版本可能是错误的,我遇到了类似的问题,以下设置对我有用,将其更改为 2.34-beta,您能否在构建 gradle 应用程序中尝试以下操作

//Dagger - Hilt
implementation "com.google.dagger:hilt-android:2.34-beta"
kapt "com.google.dagger:hilt-android-compiler:2.34-beta"

//extra dagger hilt dependecies for view model lifecycle attaching for your reference
implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03"
kapt "androidx.hilt:hilt-compiler:1.0.0"
implementation 'androidx.hilt:hilt-navigation-compose:1.0.0-alpha03'

并将 min sdk 版本更改为

  minSdk 24

我的 kotlin gradle 插件在项目级别是 1.5.10(如果有帮助的话)

【讨论】:

我试过了,我仍然得到未解决的参考。那些依赖都是很旧的版本,你为什么用这么旧的版本? 好吧,因为我试图用 jetpack compose 做一个应用程序,并且由于 JPC 也处于测试阶段,所以所有最新的 hilt 依赖项都出现了问题,我的目标是学习 JPC,而不是确保所有我的依赖是up2date。我也遇到了您面临的所有问题。因此,在阅读了无数论坛(其中许多人评论 2.34-beta 是最好的)之后,我决定使用它。 好的,干杯。他们在 gradle 和 hilt 的版本控制方面确实超越了自己。很难确定哪些版本可以在 gradle、hilt、viewmodel 和 android studio 中协同工作。感谢您的回答,我最终设法弄清楚并在解决方案中添加了答案。【参考方案2】:

问题出在 Hilt 和我的 Apollo 架构文件生成的文件中。我的 android 项目中有一个名为 user 的包,我的 Apollo 架构目录中有一个名为 User 的子文件夹,这显然使 android studio 在后续构建中感到困惑。解决方案是要么删除 Apollo 架构目录中的子文件夹,要么将项目中的包命名与架构目录中的子文件夹不同。

【讨论】:

以上是关于未解决的对视图模型的引用的主要内容,如果未能解决你的问题,请参考以下文章

视图模型应该对视图控制器中的事件做出反应吗?

AngularJS 中的视图未更新

Swift 删除对视图控制器的引用

无法对视图创建索引,因为该视图未绑定到架构

浅谈活动场景下的图算法在反作弊应用

按下拉列表对视图进行排序