【问题标题】:Cannot be provided without an @Provides- or @Produces-annotated method如果没有 @Provides- 或 @Produces-annotated 方法,则无法提供
【发布时间】:2016-02-12 21:37:29
【问题描述】:

我遇到了匕首2的一个非常奇怪的行为。也许我只是不明白。

所以我有 2 个组件:

AppComponent:

@Singleton
@Component(modules = {/*my modules*/})
public interface AppComponent extends AppGraph {

    @ForApplication Context getContext();

}

ActivityComponent:

@ForActivity
@Component(dependencies = AppComponent.class, modules = {ActivityModule.class})
public interface ActivityComponent extends AppComponent {
    void inject(BaseActivity activity);

    @ForActivity
    BaseActivity getActivity();

}

ForApplication:

@Qualifier
@Retention(RUNTIME)
public @interface ForApplication {
}

ForActivity:

@Scope
@Retention(RUNTIME)
public @interface ForActivity {
}

另外,我有一个 ActivityModule,它有 provides 方法:

@Module
public class ActivityModule {

    private final BaseActivity activity;

    public ActivityModule(BaseActivity activity) {
        this.activity = activity;
    }

    @ForActivity
    @Provides
    public BaseActivity provideActivityContext(){
        return activity;
    }

    @Provides
    public ContextWrapper provideContextWrapper(){
        return new ContextWrapperImpl(activity);
    }

    @Provides
    public CustomNavigator provideMakeDepositNavigator(){
        return new CustomNavigatorImpl(activity);
    }
}

所以,当我将ContextWrapper 注入到我的活动中时,我没有收到任何错误。

但是当我注入CustomNavigatorImpl 时,我得到了错误:

如果没有 @Provides- 或 @Produces-annotated 方法,则无法提供 CustomNavigator。匕首 2

这两个接口是一样的。但是ContextWrapper被注入了,CustomNavigator没有被注入

ContextWrapper

public interface ContextWrapper {

    String getString(int resId);

    Context getContext();
}

MakeDepositNavigator:

public interface MakeDepositNavigator {

    void showSomething1();

    void showSomething2();

    void showSomething3();

    /*...*/
}

在应用程序类中我创建DaggerAppComponent:

DaggerSdkAppComponent.builder()
                .applicationModule(new ApplicationModule(c))
                .build();

BaseActivity 我创建ActivityComponent

AppComponent component = ((HasComponent<AppComponent>) 
getApplicationContext())
                    .getComponent();
            mComponent = DaggerActivityComponent.builder()
                    .activityModule(new ActivityModule(this))
                    .appComponent(component)
                    .build();

另外,BaseActivity 有一个方法:

@Override
public ActivityComponent getComponent() {
    return mComponent;
}

CustomActivity 中,它从BaseActivity 延伸出来:

getComponent().inject(this);

更新

Activity:

public class MakeDepositActivity extends BaseActivity{

/* some code */

    @Inject
    public MakeDepositNavigator makeDepositNavigator;

    @Inject
    public ContextWrapper cw;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_make_deposit);
        getComponent().inject(this);

        /* some code */
    }


    /* some code */

}

【问题讨论】:

  • 您能否在您尝试注入的字段中添加您的活动代码?
  • @DavidMedenjak,我已经更新了问题,在底部添加了活动
  • MakeDepositNavigator 是您在模块中提供的接口吗? (你搞砸了一些重命名。)看起来没问题...我会检查你是否只使用界面
  • @DavidMedenjak,是的,这是我从ActivityModule提供的界面
  • @DavidMedenjak 我不明白为什么我对contextwrapper 没有问题,它也是接口,但它注入没有任何问题

标签: android dependency-injection dagger-2


【解决方案1】:

我在测试时遇到了类似的问题。

@ForApplication Context getContext();

由于包可访问性(默认可访问性),AppComponent 中的子类 ActivityComponent 可能无法访问。

我认为添加public 作为访问修饰符可以解决您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 2019-02-26
    • 1970-01-01
    相关资源
    最近更新 更多