这让我发疯了。我似乎无法弄清楚这有什么问题。
代码:
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
)**注入我自己(this
)来实例化{{1 }}
Dagger 2部分:
IMinutesCounter
并
@Module
public class CallAlarmModule {
IMinutesCounter.ITimerCallback timerCallBack;
public CallAlarmModule(IMinutesCounter.ITimerCallback timerCallBack) {
this.timerCallBack = timerCallBack;
}
@Provides
public IMinutesCounter.ITimerCallback provideCallAlarm() {
return timerCallBack;
}
}
它给了我
错误:如果没有@ Provide-或@ Produces-annotated方法,则无法提供IMinutesCounter。
答案 0 :(得分:0)
这意味着匕首不知道IMinutesCounter
是什么或者在哪里得到它。
虽然dagger知道MinutesMonitor
并且可以使用构造函数注入来构造它,但您没有指定IMinutesCounter
使用的内容。
你可以删除界面,只依赖于MinutesMonitor
,但我猜你真的想要使用界面及其实现,你将不得不提供实现,正如错误所示。
在您的模块中添加以下内容
@SomeScope // maybe add some scope
@Provides
public IMinutesCounter provideMinutesCounter(MinutesMonitor monitor) {
return monitor;
}
此代码段使用构造函数注入。它说提供IMinuteCounter
我需要MinutesMonitor
- 它的实现。然后你只需返回实现,并且dagger将能够在需要接口的地方使用你的实现
@SomeScope // maybe add some scope
@Provides
public IMinutesCounter provideMinutesCounter(/* MM dependencies */) {
return new MinutesMonitor(/* MM dependencies */);
}
同样可以通过自己创建对象来完成,但我想你明白为什么只使用构造函数注入会让事情变得更容易。
答案 1 :(得分:0)
我认为您可以使用以下附加行轻松解决此问题:
@Module
public class CallAlarmModule {
@Provides
public IMinutesCounter minutesCounter(MinutesCounter minutesCounter) {
return minutesCounter;
}
...
答案 2 :(得分:0)
@Inject
public IMinutesCounter minutesMonitor;
更改为
@Inject
public MinutesCounter minutesMonitor;
因为您的界面无法注入。