@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
相关产品推荐
相关产品推荐

