这真让我抓狂。我似乎无法弄清楚这是什么问题。

代码:

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)使事情变得更容易。

10-04 19:36