首页 > 解决方案 > 如何修复 - 如果没有 @Inject 构造函数或 @Provides-annotated 方法,则无法提供

问题描述

我收到一条错误消息

/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]

我不太确定在哪里添加注射。

这个需要 pdfTicketStorage 的 mu OfflineHelper 类

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

PdfStorage 类也有离线助手

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 看起来像这样

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

正如在错误中所说的 BaseScenario

我在 BaseScenario 中添加了以下代码

@Inject
PdfTicketStorage pdfTicketStorage;

我不知道还能做什么

你能建议应该做什么来解决这个问题吗?

谢谢R

标签: javaandroidkotlindependency-injectiondagger-2

解决方案


Dagger 不知道如何初始化 PdfTicketStorage。您必须将 @Inject 添加到它的构造函数中

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;
  }
}

推荐阅读