You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

@HiltViewModel注解类提示需含@Inject构造函数报错如何解决

Hilt @HiltViewModel 编译报错解决方案

报错根因

只要你给ViewModel类添加了@HiltViewModel注解,Hilt就强制要求该类有且仅有一个被@Inject修饰的构造函数,就算构造函数没有任何需要注入的参数,也必须添加该注解,否则Hilt无法生成对应的ViewModel实例提供器,就会触发你遇到的编译报错。

两种修复方案

你可以根据自己的需求二选一:

方案1:保留Hilt托管ViewModel

直接给MainActivityViewModel的无参构造函数添加@Inject注解即可,原有业务逻辑不需要改动,修改后代码如下:

@HiltViewModel
class MainActivityViewModel @Inject constructor() : ViewModel() {

    private lateinit var inAppReviewView: InAppReviewView

    /**
     * Sets an interface that backs up the In App Review prompts.
     * */
    fun setInAppReviewView(inAppReviewView: InAppReviewView) {
        this.inAppReviewView = inAppReviewView
    }

    /**
     * Start In App Review
     * */
    fun startReview() {
        inAppReviewView.showReviewFlow()
    }

    // 补充建议:避免内存泄漏,在ViewModel销毁时清空View引用
    override fun onCleared() {
        super.onCleared()
        // 若Kotlin版本较低不支持lateinit置空,可将inAppReviewView改为可空类型private var inAppReviewView: InAppReviewView? = null
        inAppReviewView = null
    }
}

方案2:不需要Hilt托管则移除对应注解

如果你的ViewModel没有任何需要Hilt注入的依赖,也不需要Hilt参与实例创建,直接删掉MainActivityViewModel类上方的@HiltViewModel注解即可,默认的by viewModels()扩展可以正常创建无参构造的ViewModel实例,不影响原有逻辑运行。

补充注意事项

你当前通过手动调用setInAppReviewView给ViewModel传Activity实例的写法要注意内存泄漏风险,最好在ViewModel的onCleared生命周期回调里把View引用置空,避免Activity销毁时被ViewModel持有无法回收。

内容的提问来源于stack exchange,提问作者Devrath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 20:09:03