java - 如何修复 - 如果没有 @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
解决方案
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;
}
}
推荐阅读
- c# - 如何将对象的日期类型转换为另一种?
- vue-router - 带有转换的路由器链接不会第二次工作:
- bootstrap-5 - 在页面刷新时保持选定的选项卡
- python - 从 python 或 pandas 中的文件名中提取和聚合数据
- reactjs - 我的动态选择这个函数以升序形式现在我想要降序形式的函数-reactjs
- webpack - Sage 10 中导入模块的正确路径
- html - 使用运行 Python 的 CSS 构建 GUI
- xcode - 停止/隐藏 GTMSessionFetcher 日志 SwiftUI
- javascript - 如何处理焦点和定义 ARIA 角色
- android - 想用不同的jdk版本升级我的旧android项目