使用Dagger(非Hilt)实现ViewModel的@AssistedInject编译失败问题
错误原因
你遇到的MissingBinding错误核心在于:ViewModelModule中通过@Binds要求Dagger直接提供DetailsViewModel实例,但使用@AssistedInject的类无法被Dagger直接实例化——因为它需要接收动态传入的辅助参数id,Dagger无法自动填充这个参数,因此报错找不到合适的实例提供方式。
解决方案
1. 移除ViewModelModule中错误的绑定
删掉ViewModelModule里针对DetailsViewModel的@Binds方法,@AssistedInject修饰的类不需要Dagger直接提供实例,而是通过你定义的@AssistedFactory来创建。
修改后的ViewModelModule.java:
@Module public abstract class ViewModelModule { // 移除bindDetailsViewModel方法 }
2. 修正AppComponent的模块引用
你的AppComponent代码存在笔误(多余的.class),需要删除该无效模块引用:
修改后的AppComponent.java:
@Singleton @Component(modules = {AppModule.class, ViewModelModule.class}) public interface AppComponent { void inject(DetailsActivity activity); }
3. 保留现有ViewModel与Activity的逻辑
你在DetailsViewModel中定义的@AssistedFactory、companion object内的factory方法,以及DetailsActivity中注入Factory并创建ViewModel的逻辑都是正确的,无需修改。
原理说明
@AssistedInject和@AssistedFactory是Dagger用于处理动态参数依赖注入的机制:Dagger会自动生成@AssistedFactory的实现类,该类会将Dagger可自动提供的依赖(如Application、DetailsRepository)与你传入的辅助参数(id)结合,最终创建出DetailsViewModel实例。移除错误的@Binds绑定后,Dagger不再尝试直接创建DetailsViewModel,转而专注提供你需要的DetailsViewModel.Factory实例,完全符合Assisted Injection的工作流程。
内容的提问来源于stack exchange,提问作者Alex Vega

