Android中Dagger构造注入报错:找不到符号,@Provides方法可正常运行
嘿,我懂你现在的困扰——用构造注入时编译报错,换成@Provides方法就一切正常,这确实挺让人挠头的。咱们一步步来排查和解决这个问题:
1. 依赖类缺少@Inject构造函数
Dagger实现构造注入的核心前提是:它必须知道怎么创建你的依赖对象。你的BakePresenter里注入了BakeApiService和BakeMapper,但如果这两个类本身没有带@Inject注解的构造函数,Dagger就找不到实例化它们的路径,自然会抛出“找不到符号”的错误。
举个例子,你的BakeApiService应该改成这样:
public class BakeApiService { // 如果有依赖(比如Retrofit),也要通过构造注入传递 @Inject public BakeApiService(Retrofit retrofit) { // 这里初始化ApiService,比如 retrofit.create(...) } // 你的接口方法 public Observable<BakingResponse> getBake() { // ... } }
同理,BakeMapper也需要添加@Inject注解的构造函数:
public class BakeMapper { @Inject public BakeMapper() { // 即使是无参构造,也需要加@Inject让Dagger识别 } public List<Bake> mapBake(BakingResponse response) { // ... } }
2. Dagger依赖版本不匹配
看你的build.gradle配置,dagger的implementation版本是2.14.1,但annotationProcessor用的是2.11——版本不一致会导致编译时注解处理异常,这很可能是报错的关键原因之一。
把dagger-compiler的版本改成和dagger一致:
implementation "com.google.dagger:dagger:2.14.1" annotationProcessor "com.google.dagger:dagger-compiler:2.14.1"
3. 清理Module中冗余的@Provides方法
你在BakeModule里写了两个BakeApiService的provide方法,这不仅多余,还可能和构造注入产生冲突。如果打算用构造注入,直接删掉这些方法,让Dagger自动通过构造函数创建实例。
修改后的BakeModule可以简化成这样:
@Module public class BakeModule { private MainView mView; public BakeModule(MainView view) { this.mView = view; } @PreActivity @Provides MainView provideMainView() { return mView; } }
4. 检查Component的配置
确保你的BakeComponents能正确获取到ApplicationComponent提供的依赖(比如Retrofit),并且ApplicationComponent已经正确声明了这些依赖的提供方式。
另外,确认@PreActivity这个自定义Scope是正确定义的,并且Component和Module都使用了一致的Scope。
5. 清理编译缓存
有时候Android Studio的编译缓存会残留旧的错误信息,导致奇怪的编译问题。执行以下步骤:
- 点击菜单栏的
Build->Clean Project - 然后点击
Build->Rebuild Project
完成这些步骤后,再尝试编译,应该就能解决构造注入的“找不到符号”问题了。
内容的提问来源于stack exchange,提问作者Ibrahim Husin

