0

I am getting an error message

/home/circleci/code/app/src/androidTest/java/com/xx/xxx/test/injection/components/MockAppComponent.java:48: error: [Dagger/MissingBinding] com.xx.xxx.printing.storage.PdfTicketStorage cannot be provided without an @Inject constructor or an @Provides-annotated method.
public interface MockAppComponent extends AppComponent {
       ^
      com.xx.xxx.printing.storage.PdfTicketStorage is injected at
          com.xx.xxx.clean.offline.OfflineHelper(…, pdfTicketStorage, …)
      com.xx.xxx.clean.offline.OfflineHelper is injected at
          com.xx.xxx.clean.offline.repository.OfflineFOrderOnCompleteApiRepository(offlineHelper, …)
      com.xx.xxx.clean.offline.repository.OfflineFOrderOnCompleteApiRepository is injected at
          com.xx.xxx.clean.forder.data.repository.FOrderRepository(…, offlineFOrderOnCompleteApiRepository)
      com.xx.xxx.clean.forder.data.repository.FOrderRepository is injected at
          com.xx.xx.test.scenarios.BaseScenario.fOrderRepository
      com.xx.xxx.test.scenarios.BaseScenario is injected at
          com.xx.xxx.test.injection.components.MockAppComponent.inject(com.xx.xxx.test.scenarios.BaseScenario)
  The following other entry points also depend on it:
      com.xx.xxx.test.injection.components.MockAppComponent.inject(com.xx.xxx.test.scenarios.VehicleTakeoverScenario)
      com.xx.xxx.injection.components.ActivityComponent.inject(com.xx.xxx.activities.MainActivity) [com.xx.xxx.test.injection.components.MockAppComponent → com.xx.xxx.injection.components.ActivityComponent]
      com.xx.xxx.injection.components.ActivityComponent.inject(com.xx.xx.fragments.fler.forder.BaseFOrderFragment) [com.xx.xxx.test.injection.components.MockAppComponent → com.xx.xxx.injection.components.ActivityComponent]
      com.xx.xxx.injection.components.ActivityComponent.inject(com.xx.xxx.fragments.fler.forder.BaseFlOrderDataFragment) [com.xx.xxx.test.injection.components.MockAppComponent → com.xx.xxx.injection.components.ActivityComponent]
      com.xx.xxx.injection.components.ActivityComponent.inject(com.xx.xxx.fragments.fller.florder.FlOrderDataFragment) [com.xx.xxx.test.injection.components.MockAppComponent → com.xx.xxx.injection.components.ActivityComponent]
      com.xx.xxx.injection.components.ActivityComponent.inject(com.xx.xxx.fragments.fller.florder.FlOrderSummaryFragment) [com.xx.xxx.test.injection.components.MockAppComponent → com.xx.xxx.injection.components.ActivityComponent]
      com.xx.xxx.injection.components.ActivityComponent.inject(com.xx.xxx.fragments.fller.florder.FOrderDeallocationFragment) [com.xx.xxx.test.injection.components.MockAppComponent → com.xx.xxx.injection.components.ActivityComponent]
      com.xx.xxx.injection.components.ActivityComponent.inject(com.xx.xxx.clean.orderslist.serviceorders.view.ServiceOrderListFragment) [com.xx.xxx.test.injection.components.MockAppComponent → com.xx.xxx.injection.components.ActivityComponent]
      com.xx.xxx.injection.components.ActivityComponent.inject(com.xx.xxx.fragments.fller.florder.ServiceOrderViewFragment) [com.xx.xxx.test.injection.components.MockAppComponent → com.xx.xxx.injection.components.ActivityComponent]
      com.xx.xxx.injection.components.ActivityComponent.inject(com.xx.xxx.clean.orderslist.serviceorders.view.ServiceOrderAdapter) [com.xx.xxx.test.injection.components.MockAppComponent → com.xx.xxx.injection.components.ActivityComponent]

I am not so sure where to add the injection.

This mu OfflineHelper class which requires pdfTicketStorage

class OfflineHelper @Inject constructor(
    private val app: App,
    private val settings: Settings,
    private val pdfTicketStorage: PdfTicketStorage,
    @Named("default") private val gson: Gson
)

PdfStorage class which also has offlinehelper

public class PdfTicketStorage {

    private final String cloudStorageBucket;
    private final Lazy<OfflineHelper> offlineHelper;

    public PdfTicketStorage(String cloudStorageBucket, Lazy<OfflineHelper> offlineHelper) {
        this.cloudStorageBucket = cloudStorageBucket;
        this.offlineHelper = offlineHelper;
    }
}

MockAppCoomponent looks likes this

@PerApp
@Component(modules = {
        MockAppModule.class,
        MockApiModule.class,
        MockServiceModule.class,
        MockNewOrderModule.class,
        MockLoginModule.class,
        MockVehicleModule.class,
        MockCommsModule.class,
        MockFlOrderModule.class,
        MockServiceOrderModule.class,
        MockSalesOrderModule.class,
        MockRealtimeMessagingModule.class,
        MockHardwareServiceModule.class,
        MockRemoteHardwareServiceModule.class
})
public interface MockAppComponent extends AppComponent {

    MockActivityComponent activityComponent(MockActivityModule module);

    void inject(BaseScenario scenario);

    void inject(VehicleTakeoverScenario scenario);

    void inject(BaseTest test);

    void inject(AaaStartupTests test);

    void inject(ServiceOrderData serviceOrderData);

    void inject(SalesOrderApiService salesOrderApiService);

    void inject(SalesOrderDataMapper salesOrderDataMapper);

    void inject(VehicleData vehicleData);

    void inject(Resources resources);
}

As in the error it said BaseScenario

I added below code in BaseScenario

@Inject
PdfTicketStorage pdfTicketStorage;

I am not sure what else to do

could you please suggest on what should be done to fix this please

Thanks R

BRDroid
  • 3,920
  • 8
  • 65
  • 143

1 Answers1

0

Dagger don't know how to initialize PdfTicketStorage. You have to add @Inject to it's constructor

public class PdfTicketStorage {

  private final String cloudStorageBucket;
  private final Lazy<OfflineHelper> offlineHelper;

  @Inject
  public PdfTicketStorage(String cloudStorageBucket, Lazy<OfflineHelper> offlineHelper) {
    this.cloudStorageBucket = cloudStorageBucket;
    this.offlineHelper = offlineHelper;
  }
}
Uuu Uuu
  • 1,282
  • 2
  • 10
  • 18
  • Hello @Uuu uuu , I tried that but still have the same error – BRDroid Feb 06 '21 at 12:01
  • any oother suggestions please? – BRDroid Feb 06 '21 at 12:01
  • hello its a bit different error now ```omponents/MockAppComponent.java:48: error: [Dagger/MissingBinding] java.lang.String cannot be provided without an @Inject constructor or an @Provides-annotated method. public interface MockAppComponent extends AppComponent {``` – BRDroid Feb 06 '21 at 21:03
  • ```@Provides @PerApp PdfTicketStorage providePdfTicketStorage(String cloudStorageBucket, Lazy offlineHelper) { return new PdfTicketStorage(cloudStorageBucket, offlineHelper); }``` – BRDroid Feb 06 '21 at 21:03
  • I added the above code in MockServiceOrderModule, but still I get the same error about String cannot be provided without... – BRDroid Feb 06 '21 at 21:04
  • dagger do not know how to get cloudCtorageBucket, check it out https://stackoverflow.com/questions/37516736/dagger-2-injecting-user-inputted-parameter-into-object – Uuu Uuu Feb 07 '21 at 03:15