作者:林白LS | 来源:互联网 | 2023-01-03 16:48
我正在尝试学习匕首2,但我对使用接口注入构造函数感到困惑.这是我的下面的代码:
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) ;
}
当我运行代码时,它显示了这个错误:
错误:(15,10)错误:com.imennmn.hellodagger2example.MainView如果没有@ Provide-annotated方法,则无法提供.com.imennmn.hellodagger2example.MainView在com.imennmn.hellodagger2example.presenterInjection.PresenterModule.provideMainPresenter(MAINVIEW)com.imennmn.hellodagger2example.MainPresenter注入在com.imennmn.hellodagger2example.MainActivity.mainPresenter com.imennmn.hellodagger2example.MainActivity注入在com.imennmn.hellodagger2example.simpleInjection.DataComponent.inject(activity)中注入
我的问题是如何通过注入匕首并绑定MainPresenter和MainActivity来提供界面MainView?任何帮助,将不胜感激 !
1> azizbekian..:
通过以下代码:
MainPresenter provideMainPresenter(MainView mainView) {
return new MainPresenter(mainView);
}
你在告诉匕首:"嘿,每当我要求你注射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();