如果没有 @Provides- 或 @Produces-annotated 方法,则无法提供 Dagger2
Dagger2 Cannot be provided without an @Provides- or @Produces-annotated method
所以我正在开发一个具有 mvp 模式的应用程序,但我在使用 Dagger2 时遇到了问题
我已经为演示者创建了一个名为 HelloPresenter 的界面。
然后我为该接口创建了一个名为 HelloPresenterImpl 的实现
我的 HelloPresenter
public interface HelloPresenter {
public void sayHello();
}
我的 HelloPresenterImpl
public class HelloPresenterImpl implements HelloPresenter {
StoryView storyView;
@Inject
public HelloPresenterImpl(StoryView storyView) {
this.storyView = storyView;
}
@Override
public void sayHello() {
Log.d(TAG, "hello there");
}
}
我的组件
@UserScope
@Component(dependencies = NetComponent.class, modules = RetrofitModule.class)
public interface StoryComponent {
void inject(MainActivity activity);
void inject(HelloPresenter helloPresenter);
}
我的模块
@Module
public class HelloModule {
@Provides
public HelloPresenter providesHelloPresenter(final HelloPresenterImpl presenter){
return presenter;
}
}
我的基础应用程序
public class BaseApplication extends Application {
private NetComponent mNetComponent;
private StoryComponent mStoryComponent;
@Override
public void onCreate() {
super.onCreate();
mNetComponent = DaggerNetComponent.builder()
.appModule(new AppModule(this))
.netModule(new NetModule())
.build();
mStoryComponent = DaggerStoryComponent.builder()
.netComponent(mNetComponent)
.retrofitModule(new RetrofitModule())
.storyModule(new StoryModule())
.build();
}
public NetComponent getNetComponent() {
return mNetComponent;
}
public StoryComponent getStoryComponent() {
return mStoryComponent;
}
现在,当我尝试将它注入到我的 MainActivity 中时,它会抛出一条错误消息
Error:(18, 10) error: com.exampleapp.Hello.presenter.HelloPresenter
cannot be provided without an @Provides- or @Produces-annotated
method. com.exampleapp.Hello.presenter.HelloPresenter is injected at
com.exampleapp.Hello.MainActivity.HelloPresenter
com.exampleapp.Hello.MainActivity is injected at
com.exampleapp.di.components.HelloComponent.inject(activity)
public class MainActivity extends AppCompatActivity {
@Inject
SharedPreferences mSharedPreferences;
@Inject
StoryInterface storyInterface;
@Inject
HelloPresenter helloPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
((BaseApplication) getApplication()).getStoryComponent().inject(this);
helloPresenter.sayHello(); // This throws an Error
}
有人能给我指出正确的方向吗?谢谢
在没有看到整个项目的情况下,我的猜测是 Dagger 无法确定如何创建 HelloPresenterImpl
实例,因为您没有提供 StoryView
。我想你需要:
@Provides
public StoryView providesStoryView() {
return new StoryView();
}
所以我正在开发一个具有 mvp 模式的应用程序,但我在使用 Dagger2 时遇到了问题
我已经为演示者创建了一个名为 HelloPresenter 的界面。
然后我为该接口创建了一个名为 HelloPresenterImpl 的实现
我的 HelloPresenter
public interface HelloPresenter {
public void sayHello();
}
我的 HelloPresenterImpl
public class HelloPresenterImpl implements HelloPresenter {
StoryView storyView;
@Inject
public HelloPresenterImpl(StoryView storyView) {
this.storyView = storyView;
}
@Override
public void sayHello() {
Log.d(TAG, "hello there");
}
}
我的组件
@UserScope
@Component(dependencies = NetComponent.class, modules = RetrofitModule.class)
public interface StoryComponent {
void inject(MainActivity activity);
void inject(HelloPresenter helloPresenter);
}
我的模块
@Module
public class HelloModule {
@Provides
public HelloPresenter providesHelloPresenter(final HelloPresenterImpl presenter){
return presenter;
}
}
我的基础应用程序
public class BaseApplication extends Application {
private NetComponent mNetComponent;
private StoryComponent mStoryComponent;
@Override
public void onCreate() {
super.onCreate();
mNetComponent = DaggerNetComponent.builder()
.appModule(new AppModule(this))
.netModule(new NetModule())
.build();
mStoryComponent = DaggerStoryComponent.builder()
.netComponent(mNetComponent)
.retrofitModule(new RetrofitModule())
.storyModule(new StoryModule())
.build();
}
public NetComponent getNetComponent() {
return mNetComponent;
}
public StoryComponent getStoryComponent() {
return mStoryComponent;
}
现在,当我尝试将它注入到我的 MainActivity 中时,它会抛出一条错误消息
Error:(18, 10) error: com.exampleapp.Hello.presenter.HelloPresenter cannot be provided without an @Provides- or @Produces-annotated method. com.exampleapp.Hello.presenter.HelloPresenter is injected at com.exampleapp.Hello.MainActivity.HelloPresenter com.exampleapp.Hello.MainActivity is injected at com.exampleapp.di.components.HelloComponent.inject(activity)
public class MainActivity extends AppCompatActivity {
@Inject
SharedPreferences mSharedPreferences;
@Inject
StoryInterface storyInterface;
@Inject
HelloPresenter helloPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
((BaseApplication) getApplication()).getStoryComponent().inject(this);
helloPresenter.sayHello(); // This throws an Error
}
有人能给我指出正确的方向吗?谢谢
在没有看到整个项目的情况下,我的猜测是 Dagger 无法确定如何创建 HelloPresenterImpl
实例,因为您没有提供 StoryView
。我想你需要:
@Provides
public StoryView providesStoryView() {
return new StoryView();
}