使用 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
}
我刚开始使用 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
}