Android 匕首2:错误:[匕首/丢失绑定]无法解决此问题

Android 匕首2:错误:[匕首/丢失绑定]无法解决此问题,android,dependency-injection,dagger-2,Android,Dependency Injection,Dagger 2,我得到了一个[Dagger/MissingBinding]错误,我无法找出这个错误的原因 以下是完整的错误堆栈: 错误:[Dagger/MissingBinding]如果没有,则无法提供java.io.File @Inject构造函数或@Inject提供带注释的方法。java.io.xml文件 是在服务时注入的。keysterervice(keysterefile) service.keystepreservice在 di.Module.WalletRepositoryModule.getWal

我得到了一个
[Dagger/MissingBinding]
错误,我无法找出这个错误的原因

以下是完整的错误堆栈:

错误:[Dagger/MissingBinding]如果没有,则无法提供java.io.File @Inject构造函数或@Inject提供带注释的方法。java.io.xml文件 是在服务时注入的。keysterervice(keysterefile) service.keystepreservice在 di.Module.WalletRepositoryModule.getWalletRepository(…, keyStoreService)repository.WalletRepository接口提供于 di.component.ApplicationComponent.getWalletRepository()

以下 其他入口点也取决于此: dagger.android.AndroidInjector.Injection(T) [di.component.ApplicationComponent? di.Module.BindModule_BindStartModule.StartActivitySubcomponent] dagger.android.AndroidInjector.Injection(T) [di.component.ApplicationComponent? di.Module.BindModule_BindAddWalletActivity.AddWalletActivity子组件]

密钥保留级别:

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后,我才出现此错误。有什么建议吗?

你必须告诉Dagger如何解析
文件。我建议您使用
@提供
@命名的
注释方法。乙二醇

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

@Inject
public KeyStoreService(File keyStoreFile) {


谢谢我工作过。如果你有时间的话,只是一些快速跟进的问题。为什么在添加WalletrepositoryModule之后而不是之前发生此错误?它不需要提前“@命名”,也不会抛出任何错误。我可以使用限定符而不是“@Named”吗?我可以代替模块中的命名/限定符吗?这样我就不必在keystreservice类中使用“@Named/@Qualifier”?因为
WalletRepositoryInterface
keystreservice
作为依赖项。您可以使用带注释的
@Provides
方法返回
密钥保留
依赖项。在该方法中,您必须手动调用
新keystreservice
再次感谢!
@Inject
public KeyStoreService(@Named("KEY_STORE_FILE") File keyStoreFile) {