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

使用Dagger(非Hilt)实现ViewModel的@AssistedInject编译失败问题

解决Dagger 2.35.1中@AssistedInject ViewModel的MissingBinding错误

错误原因

你遇到的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 02:47:43