使用 Dagger 时出错并有一个 base class

Getting an error using Dagger and having a base class

我刚开始使用 Retrofit、Dagger 和 MVP,我 运行 遇到了一个我不太明白的问题。

我有一个 API 组件和模块,如下所示:

Api模块:

@Module
public class ApiModule {
    @Provides @NonNull @Singleton
    public Api provideApi(RestAdapter restAdapter){
        return restAdapter.create(Api.class);
    }

    @Provides @NonNull @Singleton
    public RestAdapter provideRestAdapter(){
        return ApiRestAdapter.getInstance();
    }
}

Api分量:

@Singleton
@Component(modules = {
        ApiModule.class
})
public interface ApiComponent {
    Api api();

    void inject(BaseActivity activity);
}

我有一个基础 activity 看起来像这样:

public abstract class BaseActivity extends AppCompatActivity {

    @Inject
    protected Api api; //this can be used by any activity that is extending BaseActivity

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        //create the api component
        ApiComponent component = DaggerApiComponent.builder()
                .apiModule(new ApiModule())
                .build();

        component.inject(this);//perform field injection
    }
}

这样任何 class 都可以访问 Api class 来做他们想做的任何事情。 我还有一个名为 WalkthroughActivity 的 activity,它实现了一个 View 并具有一个将要注入的 Presenter。我也为此创建了一个模块和组件。 WalkthroughActivityModule:

@Module
public class WalkthroughActivityModule {

    @Provides @NonNull @Singleton
    public WalkthroughActivityPresenter providePresenter(){
        return new WalkthroughActivityPresenter();
    }
}

WalkthroughActivityComponent:

@Singleton
@Component(
        modules = {
                WalkthroughActivityModule.class
        }
)
public interface WalkthroughActivityComponent {

    WalkthroughActivityPresenter walkthroughActivityPresenter();

    void inject(WalkthroughActivity walkthroughActivity);
}

演练活动:

public class WalkthroughActivity extends BaseActivity implements WalkthroughActiviyView {

    @Inject WalkthroughActivityPresenter walkthroughActivityPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_walkthrough);

        DaggerWalkthroughActivityComponent.builder()
                .walkthroughActivityModule(new WalkthroughActivityModule())
                .build()
                .inject(this);

        showWalkthroughPager();
    }
 }

我收到一条错误消息:

Error:(26, 10) error: com.myapp.api.Api cannot be provided without an @Provides- or @Produces-annotated method.
com.myapp.ui.base.BaseActivity.api
[injected field of type: com.myapp.api.Api api]

我的直接猜测是它与扩展 BaseActivity 的 WalkThorughActivity 有关。或者它可能与范围界定有关。但我不太明白如何解决这个问题。有人可以解释为什么会这样吗?

提前致谢!

1) 您在 WalkthroughActivityComponent 中注入了 WalkthroughActivity 的依赖项,它不知道 ApiModule

2) 不能通过父 class 注入依赖项。你应该这样做

class BaseActivity {
    @Inject Foo foo
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState)
        ApiComponent component = DaggerApiComponent.builder()
                .apiModule(new ApiModule())
                .build();
        injectDependencies(component)
    }

    public abstract void injectDependencies(Component component);
}

class ChildActivity extends BaseActivity {
    @Override
    public void injectDependencies(ApiComponent component) {
        component.inject(this);
    }
}

@Singleton
@Component(modules = {
        ApiModule.class
})
public interface ApiComponent {
    Api api();
    void inject(ChildActivity activity); // Injecting into child object
}