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

Car*_*ton 5 android dependency-injection dagger-2

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

这是完整的错误堆栈:

错误:[Dagger/MissingBinding] java.io.File 不能在没有 @Inject 构造函数或 @Provides-annotated 方法的情况下提供。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);
    }
}
Run Code Online (Sandbox Code Playgroud)

WalletRepositoryModule 类:

@Module
public class WalletRepositoryModule {

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

}
Run Code Online (Sandbox Code Playgroud)

应用组件类:

@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();

}
Run Code Online (Sandbox Code Playgroud)

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

Bla*_*elt 1

你必须告诉Dagger如何解决File。我建议你一个@Provides @Named带注释的方法。例如

  @Provides
  @Named("KEY_STORE_FILE") 
  public File provideKeyStoreFile() {
     return new File(path/to/keystore)
  }
Run Code Online (Sandbox Code Playgroud)

并改变

@Inject
public KeyStoreService(File keyStoreFile) {
Run Code Online (Sandbox Code Playgroud)

@Inject
public KeyStoreService(@Named("KEY_STORE_FILE") File keyStoreFile) {
Run Code Online (Sandbox Code Playgroud)

  • 因为 `WalletRepositoryInterface` 有 `KeyStoreService` 作为依赖项。您可以使用带注释的“@Provides”方法返回“KeyStoreService”依赖项。在该方法中,您必须手动调用“new KeyStoreService” (2认同)