我刚开始使用Retrofit,匕首& MVP,我遇到了一个我不太明白的问题。使用匕首获得一个错误并拥有一个基类
我有一个API组件&模块,看起来像这样:
ApiModule:
@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();
}
}
ApiComponent:
@Singleton
@Component(modules = {
ApiModule.class
})
public interface ApiComponent {
Api api();
void inject(BaseActivity 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
}
}
这样,任何类都可以访问Api类来完成他们想做的任何事情。 我也有一个名为WalkthroughActivity的活动,它实现了一个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);
}
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]
我的直接猜测是,它与WalkThorughActivity扩展BaseActivity有关。或者也许它与范围界定有关。但我不太明白如何在这个问题上包裹我的头。有人能解释为什么会发生这种情况吗?
在此先感谢!
当我需要注入多个组件时会发生什么?那么,如果我想在WalkthroughActivity中注入WalkthroughActivityComponent&ApiComponent呢? – Sree
你可以在调用super.onCreate之后在重写方法中注入ApiComponent并在WalkthroughActivity#onCreate()中注入WalkthroughActivityComponent。或者你可以在BaseActivity上使用ApiComponent的getter,并在injectDepencencies中使用它来获取所需的组件。这样您就不必将组件传递给此方法,并且将来可以添加其他组件。例如,如果您的WalkthroughActivity需要某些应用程序级别组件的依赖性,则可以在Application类上为该组件实现getter,并使用适当的injectDependency方法调用它。 –