我正在我的项目中实施dagger 2。为此,我写了下面几行代码:
@Inject
VideoControllerView mediaController;
@Module
public class PlayerModule {
@Provides
VideoControllerView providesVideoControllerView(Context context, VideoControllerView.Controlers cntrls) {
return new VideoControllerView(context, cntrls);
}
}
@Component(modules = PlayerModule.class)
public interface PlayerComponent {
VideoControllerView getVideoControllerView();
}
但是当我尝试编译我的应用程序时,我得到的错误是:
Error:(14, 25) error: android.content.Context cannot be provided without an @Provides-annotated method.
android.content.Context is injected at
com.multitv.multitvplayersdk.module.PlayerModule.providesVideoControllerView(context, …)
com.multitv.multitvplayersdk.controls.VideoControllerView is provided at
com.multitv.multitvplayersdk.component.PlayerComponent.getVideoControllerView()
我已经了解了如何解决这个问题,但无济于事。请帮帮我。
答案 0 :(得分:8)
请尝试了解错误。
PlayerModule.providesVideoControllerView(context, …)
需要上下文,但Dagger无权访问任何Context
对象,因此无法传入任何Context
。因此,它会创建错误,告诉您它无法找到任何Context
,并且您应该为此添加一种方法。
如果没有@ Provide-annotated方法,则无法提供上下文。
因此......如果没有context
注释方法,则无法提供@Provides
。
确保PlayerModule
所属的组件可以访问上下文。
将其作为ApplicationComponent的子组件,向您的PlayerModule
添加一个Context,将您的Activity实例绑定为Context,等等
有很多方法可以做到这一点,但最终你需要在你的一个模块中使用如下方法:
@Provides Context provideContext() { return myContext; }
一旦Dagger找到Context
,错误就会消失。
答案 1 :(得分:1)
您需要以下模块:
@Module
public class ContextModule {
private Context context;
public ContextModule(Context context) {
this.context = context;
}
@Provides
@UefaApplicationScope
Context provideContext() {
return context;
}
}
然后注入方法:
@Provides
@Inject
VideoControllerView providesVideoControllerView(Context context, VideoControllerView.Controlers cntrls) {
return new VideoControllerView(context, cntrls);
}