嗨,我有一个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
的类型。有两种解决方案:
- 为
String
创建另一个@Provides
。不建议这样做,因为如果需要另一种String
类型,您将遇到问题。 - (推荐)用
@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模块中提供字符串?