无法弄清楚“没有@ provide-annotated方法”错误就无法提供

时间:2016-05-05 20:05:55

标签: android dependency-injection interface compiler-errors dagger-2

这让我发疯了。我似乎无法弄清楚这有什么问题。

代码:

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。

3 个答案:

答案 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;

因为您的界面无法注入。