gpt4 book ai didi

android - 无法弄清楚 "cannot be provided without an @provides-annotated method"错误

转载 作者:行者123 更新时间:2023-12-02 11:01:35 25 4
gpt4 key购买 nike

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

代码:

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);
}

它给了我

error: IMinutesCounter cannot be provided without an @Provides- or @Produces-annotated method.

最佳答案

这意味着 Dagger 不知道 IMinutesCounter 是什么是或在哪里得到一个。

虽然 Dagger 知道 MinutesMonitor并且可以使用构造函数注入(inject)来构造它,您无需指定 IMinutesCounter 使用什么.

您可以删除接口(interface)并仅依赖 MinutesMonitor ,但我猜您实际上想要使用接口(interface)及其实现,正如错误所暗示的那样,您必须为此提供实现。

在您的模块中添加如下内容

@SomeScope // maybe add some scope
@Provides
public IMinutesCounter provideMinutesCounter(MinutesMonitor monitor) {
return monitor;
}

这个 fragment 利用了构造函数注入(inject)。它说要提供 IMinuteCounter我需要一个 MinutesMonitor ——它的实现。然后,您只需返回实现,dagger 将能够在请求接口(interface)的地方使用您的实现。
@SomeScope // maybe add some scope
@Provides
public IMinutesCounter provideMinutesCounter(/* MM dependencies */) {
return new MinutesMonitor(/* MM dependencies */);
}

同样可以通过自己创建对象来完成,但我想你明白为什么只使用构造函数注入(inject)会使事情变得更容易。

关于android - 无法弄清楚 "cannot be provided without an @provides-annotated method"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37059324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com