Dagger 2: 错误:[Dagger/MissingBinding] 无法解决此问题

6
我遇到了一个[Dagger/MissingBinding]错误,但我无法理解这个错误的原因。
以下是完整的错误堆栈:
error: [Dagger/MissingBinding] java.io.File无法在没有@Inject构造函数或@Provides注释方法的情况下提供。 java.io.File被注入于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);
    }

}

应用程序组件类:

@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后,我遇到了这个错误。有什么建议吗?


1
有些从Google偶然发现这个问题的人可能会遇到和我一样的困境:Lombok在与Dagger兼容性方面非常不一致。如果你正在生成注入的构造函数,请始终通过手动编写构造函数来开始故障排除。 - forresthopkinsa
1个回答

1

您需要告诉Dagger如何解析文件。我建议您使用一个带有@Provides@Named注释的方法。例如:

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

和改变

@Inject
public KeyStoreService(File keyStoreFile) {

in

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

谢谢!我已经解决了。如果您有时间,还有一些跟进问题。 为什么在添加WalletrepositoryModule之后出现了此错误,而之前没有出现?它以前不需要“@Named”,也没有抛出任何错误。 我能否使用Qualifier代替“@Named”,并且可以在模块中处理命名/限定,以便我不必在Keystoreservice类中使用“@Named / @Qualifier”? - CJR
2
因为WalletRepositoryInterface依赖于KeyStoreService,您可以使用带有注释的@Provides方法返回KeyStoreService的依赖项。在该方法中,您需要手动调用new KeyStoreService - Blackbelt
1
再次感谢! - CJR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接