【问题标题】:Dagger 2: error: [Dagger/MissingBinding] cannot solve this oneDagger 2:错误:[Dagger/MissingBinding] 无法解决这个问题
【发布时间】:2026-01-03 21:05:02
【问题描述】:

我收到 [Dagger/MissingBinding] 错误,但我不知道为什么会出现此错误。

这是完整的错误堆栈:

错误:[Dagger/MissingBinding] java.io.File 无法提供 @Inject 构造函数或 @Provides 注释方法。 java.io.文件 在 service.KeyStoreService(keyStoreFile) 注入 service.KeyStoreService 被注入 di.Module.WalletRepositoryModule.getWalletRepository(…, keyStoreService) repository.WalletRepositoryInterface 提供于 di.component.ApplicationComponent.getWalletRepository()

以下 其他入口点也依赖于它: dagger.android.AndroidInjector.inject(T) [di.component.ApplicationComponent ? di.Module.BindModule_BindStartModule.StartActivitySubcomponent] dagger.android.AndroidInjector.inject(T) [di.component.ApplicationComponent ? di.Module.BindModule_BindAddWalletActivity.AddWalletActivitySubcomponent]

KeyStoreService 类:

public class KeyStoreService implements KeyStoreServiceInterface {

    private final KeyStore keyStore;

    @Inject
    public KeyStoreService(File keyStoreFile) {
        keyStore = new KeyStore(keyStoreFile.getAbsolutePath(), Geth.LightScryptN, Geth.LightScryptP);
    }
}

WalletRepositoryModule 类:

@Module
public class WalletRepositoryModule {

    @Provides
    @ApplicationScope
    WalletRepositoryInterface getWalletRepository(SharedPreferencesHelper sharedPreferencesHelper, KeyStoreService keyStoreService){
        return new WalletRepository(sharedPreferencesHelper, keyStoreService);
    }

}

ApplicationComponent 类:

@ApplicationScope
@Component(modules = {ApplicationContextModule.class,
        SharedPreferencesModule.class,
        KeyStoreModule.class,
        SharedPreferenceHelperModule.class,
        AndroidInjectionModule.class,
        AndroidsupportInjectionModule.class,
        WalletRepositoryModule.class})
public interface ApplicationComponent {

    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder application(MyApplication myApplication);
        ApplicationComponent build();
    }

    void inject(MyApplication myApplication);

    @ApplicationContext
    Context getApplicationContext();

    SharedPreferences getSharedPreferences();

    KeyStoreServiceInterface getKeyStoreService();

    SharedPreferencesHelper getSharedPreferencesHelper();

    WalletRepositoryInterface getWalletRepository();

}

所有其他模块都在/正在工作。只有在添加 WalletRepositoryModule 之后我才收到此错误。有什么建议吗?

【问题讨论】:

    标签: android dependency-injection dagger-2


    【解决方案1】:

    你必须告诉 Dagger 如何解决File。我建议您使用 @Provides @Named 带注释的方法。 EG

      @Provides
      @Named("KEY_STORE_FILE") 
      public File provideKeyStoreFile() {
         return new File(path/to/keystore)
      }
    

    改变

    @Inject
    public KeyStoreService(File keyStoreFile) {
    

    @Inject
    public KeyStoreService(@Named("KEY_STORE_FILE") File keyStoreFile) {
    

    【讨论】:

    • 谢谢!我工作。如果你有时间,只是一些快速跟进的问题。为什么在添加 WalletrepositoryModule 之后而不是之前出现此错误?它不需要是“@Named”,也没有抛出任何错误。我可以使用限定符而不是“@Named”吗?我可以处理模块中的命名/限定符,这样我的 Keystoreservice 类中就不必有“@Named/@Qualifier”吗?
    • 因为 WalletRepositoryInterface 具有 KeyStoreService 作为依赖项。您可以使用带注释的 @Provides 方法,该方法返回 KeyStoreService 依赖项。在该方法中,您必须手动调用new KeyStoreService
    • 再次感谢!
    最近更新 更多