如何解决dagger错误-如果没有@Inject构造函数或@ providers注释的方法,就不能提供String.&l



嗨,我有一个PdfTicketStorage类,它有一个接受2个参数的构造函数,我在构造函数中添加了@Inject,也在MockServiceOrderModule中添加了@Inject。但是我得到一个错误

MockAppComponent.java:48: error: [Dagger/MissingBinding] java.lang.String cannot be provided without an @Inject constructor or an @Provides-annotated method.

完整错误是

/home/circleci/code/app/src/androidTest/java/com/xx/xxx/test/injection/components/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 {
^
java.lang.String is injected at
com.xxx.xx.test.injection.modules.MockServiceOrderModule.providePdfTicketStorage(cloudStorageBucket, …)
com.xxx.xx.printing.storage.PdfTicketStorage is injected at
com.xxx.xx.clean.offline.OfflineHelper(…, pdfTicketStorage, …)
com.xxx.xx.clean.offline.OfflineHelper is injected at
com.xxx.xx.clean.offline.repository.OfflineUserApiRepository(…, offlineHelper)
com.xxx.xx.clean.offline.repository.OfflineUserApiRepository is injected at
com.xxx.xx.clean.florder.data.repository.flOrderRepository(offlineUserApiRepository, …)
com.xxx.xx.clean.florder.data.repository.flOrderRepository is injected at
com.xxx.xx.test.scenarios.BaseScenario.flOrderRepository
com.xxx.xx.test.scenarios.BaseScenario is injected at
com.xxx.xx.test.injection.components.MockAppComponent.inject(com.xxx.xx.test.scenarios.BaseScenario)
The following other entry points also depend on it:
com.xxx.xx.test.injection.components.MockAppComponent.inject(com.xxx.xx.test.scenarios.VehicleTakeoverScenario)
com.xxx.xx.injection.components.ActivityComponent.inject(com.xxx.xx.activities.MainActivity) [com.xxx.xx.test.injection.components.MockAppComponent → com.xxx.xx.injection.components.ActivityComponent]
com.xxx.xx.injection.components.ActivityComponent.inject(com.xxx.xx.fragments.fller.florder.BaseflOrderFragment) [com.xxx.xx.test.injection.components.MockAppComponent → com.xxx.xx.injection.components.ActivityComponent]
com.xxx.xx.injection.components.ActivityComponent.inject(com.xxx.xx.fragments.fller.florder.BaseflOrderDataFragment) [com.xxx.xx.test.injection.components.MockAppComponent → com.xxx.xx.injection.components.ActivityComponent]
com.xxx.xx.injection.components.ActivityComponent.inject(com.xxx.xx.fragments.fller.florder.flOrderDataFragment) [com.xxx.xx.test.injection.components.MockAppComponent → com.xxx.xx.injection.components.ActivityComponent]
com.xxx.xx.injection.components.ActivityComponent.inject(com.xxx.xx.fragments.fller.florder.flOrderSummaryFragment) [com.xxx.xx.test.injection.components.MockAppComponent → com.xxx.xx.injection.components.ActivityComponent]
com.xxx.xx.injection.components.ActivityComponent.inject(com.xxx.xx.fragments.fller.florder.flOrderDeallocationFragment) [com.xxx.xx.test.injection.components.MockAppComponent → com.xxx.xx.injection.components.ActivityComponent]
com.xxx.xx.injection.components.ActivityComponent.inject(com.xxx.xx.clean.orderslist.serviceorders.view.ServiceOrderListFragment) [com.xxx.xx.test.injection.components.MockAppComponent → com.xxx.xx.injection.components.ActivityComponent]
com.xxx.xx.injection.components.ActivityComponent.inject(com.xxx.xx.fragments.fller.florder.ServiceOrderViewFragment) [com.xxx.xx.test.injection.components.MockAppComponent → com.xxx.xx.injection.components.ActivityComponent]
com.xxx.xx.injection.components.ActivityComponent.inject(com.xxx.xx.clean.orderslist.serviceorders.view.ServiceOrderAdapter) [com.xxx.xx.test.injection.components.MockAppComponent → com.xxx.xx.injection.components.ActivityComponent]
and 31 others/home/circleci/code/app/src/androidTest/java/com/xx/xxx/test/injection/components/MockAppComponent.java:48: error: [Dagger/MissingBinding] java.lang.String cannot be provided without an @Inject constructor or an @Provides-annotated method.

PdfTicketStorage

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

OfflineHelper

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

MockServiceOrderModule

@Module
public class MockServiceOrderModule {
@Provides @PerApp
PdfTicketStorage providePdfTicketStorage(String cloudStorageBucket, Lazy<OfflineHelper> offlineHelper) {
return new PdfTicketStorage(cloudStorageBucket, offlineHelper);
}
}

你能告诉我这里哪里做错了吗?

你的建议,我该如何解决这个问题这将是非常有用的

谢谢R

Dagger的无环图不知道如何在String cloudStorageBucket的情况下提供String的类型。有两种解决方案:

  1. String创建另一个@Provides。不建议这样做,因为如果需要另一种String类型,您将遇到问题。
  2. (推荐)用@Named("cloudStorageBucket")标记1中的@Provides

如果String将在运行时提供,也可以使用@assisted-inject

首先,当您已经在此dagger模块中提供了对象时:

@Module
public class MockServiceOrderModule {
@Provides @PerApp
PdfTicketStorage providePdfTicketStorage(String cloudStorageBucket, Lazy<OfflineHelper> offlineHelper) {
return new PdfTicketStorage(cloudStorageBucket, offlineHelper);
}
}

PdfTicketStorage类中不需要使用构造函数注入。你可以直接注入对象,然后像这样使用:

@PerApp
public class PdfTicketStorage {
@Inject
public PdfTicketStorage pdfTicketStorage;
}

但是你也必须确保在dagger模块中提供字符串。不确定为什么需要在dagger模块中提供字符串?

最新更新