我正在尝试学习 dagger 2,但我对使用接口(interface)注入(inject)构造函数感到困惑。这是我的以下代码:
MainActivity.java
public class MainActivity extends AppCompatActivity implements MainView {
// this keyword of request dependency . At compiling process, dagger will look at all of these annotations
//to create the exact dependency
@Inject MainPresenter mainPresenter ;
TextView textView ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textview) ;
DaggerPresenterComponent.create().inject(this);
textView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
mainPresenter.doThings(8555) ;
}
});
}
/**********************************/
@Override
public void invokeRandomViewMethod(String msg) {
textView.setText(msg);
}
}
MainPresenter.java
public class MainPresenter {
private MainView mainView ;
@Inject
public MainPresenter(MainView mainView) {
this.mainView = mainView;
}
public void doThings(int value){
Random random = new Random();
int rand= random.nextInt(value) ;
if(mainView != null){
mainView.invokeRandomViewMethod("You random number is "+rand);
}
}
public interface MainView {
void invokeRandomViewMethod(String msg) ;
}
}
这是模块:
@Module
public class PresenterModule {
@Provides
// this is the method that will provide the dependancy
MainPresenter provideMainPresenter(MainView mainView){
return new MainPresenter(mainView);
}
}
这是组件
@Component (modules = PresenterModule.class)
public interface PresenterComponent {
void inject(MainActivity activity) ;
}
当我运行代码时,它显示了这个错误:
Error:(15, 10) error: com.imennmn.hellodagger2example.MainView cannot be provided without an @Provides-annotated method. com.imennmn.hellodagger2example.MainView is injected at com.imennmn.hellodagger2example.presenterInjection.PresenterModule.provideMainPresenter(mainView) com.imennmn.hellodagger2example.MainPresenter is injected at com.imennmn.hellodagger2example.MainActivity.mainPresenter com.imennmn.hellodagger2example.MainActivity is injected at com.imennmn.hellodagger2example.simpleInjection.DataComponent.inject(activity)
我的问题是如何通过用 Dagger 注入(inject)接口(interface) MainView 并绑定(bind) MainPresenter 和 MainActivity 来提供接口(interface)? 任何帮助,将不胜感激 !
最佳答案
通过以下代码:
MainPresenter provideMainPresenter(MainView mainView) {
return new MainPresenter(mainView);
}
你在告诉 dagger:“嘿,每当我要求你注入(inject) MainPresenter
时,请使用 MainView
构建它”。
但是尖锐的提示,因为你没有具体说明他应该如何构建/获取 MainView
。
因此,在您的 PresenterModule
中执行此操作:
@Module
public class PresenterModule {
MainView mainView;
public PresenterModule(MainView mainView) {
this.mainView = mainView;
}
@Provides
MainPresenter provideMainPresenter() {
return new MainPresenter(mainView);
}
}
然后在构建组件时:
DaggerPresenterComponent.builder()
.presenterModule(new PresenterModule(this))
.build();
关于java - Dagger 2 : inject an interface in a constructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47990601/