Dagger 2错误:如果没有@ Provide-annotated方法,则无法提供android.content.Context

时间:2017-06-05 06:48:44

标签: android dagger-2

我正在我的项目中实施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()

我已经了解了如何解决这个问题,但无济于事。请帮帮我。

2 个答案:

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