这真让我抓狂。我似乎无法弄清楚这是什么问题。
代码:
public interface IMinutesCounter {
void startTimer();
void stopTimer();
}
及其实现:
public class MinutesMonitor implements IMinutesCounter {
private ITimerCallback timerCallback;
@Inject
public MinutesMonitor(ITimerCallback timerCallback) {
this.timerCallback = timerCallback;
}
void startTimer(){...}
void stopTimer(){...}
}
CallAlarm
实现ITimerCallback
public class CallAlarm implements MinutesMonitor.ITimerCallback {
@Inject
public IMinutesCounter minutesMonitor;
public CallAlarm (HealthService context) {
this.minutesMonitor = minutesMonitor;
....
}
}
如您所见,
IMinutesCounter
需要一个MinutesMonitor.ITimerCallback
。我想要的是-**从
CallAlarm
类(实现MinutesMonitor.ITimerCallback
)**自己注入(inject)(this
)以实例化IMinutesCounter
。Dagger 2部分:
@Module
public class CallAlarmModule {
IMinutesCounter.ITimerCallback timerCallBack;
public CallAlarmModule(IMinutesCounter.ITimerCallback timerCallBack) {
this.timerCallBack = timerCallBack;
}
@Provides
public IMinutesCounter.ITimerCallback provideCallAlarm() {
return timerCallBack;
}
}
和:
@Component(modules = CallAlarmModule.class)
public interface CallAlarmComponent {
void injectTimerCallback(IMinutesCounter.ITimerCallback service);
}
它给了我
最佳答案
这意味着 Dagger 不知道什么是IMinutesCounter
或在哪里获取。
虽然dagger知道MinutesMonitor
并可以使用构造函数注入(inject)来构造它,但是您没有指定IMinutesCounter
使用什么。
您可以仅删除接口(interface),而仅依赖于MinutesMonitor
,但是我猜您实际上要使用该接口(interface)及其实现,因为错误提示,您将不得不为其提供实现。
在您的模块中添加如下内容
@SomeScope // maybe add some scope
@Provides
public IMinutesCounter provideMinutesCounter(MinutesMonitor monitor) {
return monitor;
}
此代码段使用构造函数注入(inject)。它说要提供
IMinuteCounter
,我需要一个MinutesMonitor
-它的实现。然后,您只需返回实现,并且dagger将能够在需要接口(interface)的地方使用您的实现。@SomeScope // maybe add some scope
@Provides
public IMinutesCounter provideMinutesCounter(/* MM dependencies */) {
return new MinutesMonitor(/* MM dependencies */);
}
可以通过自己创建对象来完成相同的操作,但是我想您知道为什么仅使用构造函数注入(inject)使事情变得更容易。