如何使用Dagger2 for android将视图注入演示者



我想将injectview (Activity object)合并到Presenter中。现在,我正在使用Presenter类的setter手动设置视图。如何使用dagger实现这一点?你能给我看一个如何做的示例代码吗?

这就是主活动创建演示者的方式

public class MainActivity extends AppCompatActivity implements CountPresenter.View, ToastPresenter.View {
@Inject
CountPresenter countPresenter;
@Inject
ToastPresenter toastPresenter;
TextView countText;
Toast toast;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
countText = findViewById(R.id.text_count);
DaggerToastPresenterComponent.create().inject(this);
DaggerCountPresenterComponent.create().inject(this);
countPresenter.setView(this);
toastPresenter.setView(this) ;
findViewById(R.id.button_count).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
countPresenter.incrementCount();
}
});
findViewById(R.id.button_toast).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
toastPresenter.handleToastButtonClick();
}
});
}
}

**演示者类代码:**

public class CountPresenter {
private Counter counter ;

public void setView(View view) {
this.view = view;
}
private View view ;
@Inject
public CountPresenter() {
counter =  Counter.getInstance() ;
}
public void incrementCount(){
counter.setCount(counter.getCount()+1);
view.setCounterText(counter.toString());
}
public interface View {
void setCounterText(String val) ;
}
}

此处为完整代码:

https://github.com/nateshmbhat/FresherAssignment2020/tree/nateshmbhat/Apps/CounterApp_MVP_Dagger/app/src/main/java/com/techy/nateshmbhat/contacto

我要写下的步骤

首先,您需要添加模块

@Module
class CountPresenterModule {
@Provides
@Singleton
fun providCountPresenter(): CountPresenter.View {
return CountPresenter()
}
}

类似地,为ToastPresenter 添加模块类

之后,在AppComponent类中添加新添加的模块类的引用

@Singleton
@Component(modules = [AppModule::class, .....,ToastPresenterModule::class, CountPresenterModule::class]){
fun inject(mainActivity: MainActivity)
}

并且被dagger/注射的魔力逗乐。

Java 中的第2部分

@Singleton
@Component(modules = {AppModule.class, ToastPresenterModule.class, CountPresenterModule.class}) {
void inject(MainActivity mainActivity);
}

Helo,这是我在科特林的解决方案。第一您将创建一个接口

接口合同{

interface Presenter{
fun setView(view: View)
}

}

然后在演示者内部,您将实现它(以及演示者应该拥有的其他方法(在该界面中预定义它们之后))

: Contract.Presenter 

在演示程序中,您将创建View类型的后期init-var视图

private lateinit var view: View

然后在演示者的内部实现演示者界面,您将定义这个

override fun setView(view: View) {
this.view = view
}

在MainActivity中,您将拥有

@注入lateinit-var演示者:合同。演示者

在简历中,你会将其设置为查看

override fun onResume() {
super.onResume()
presenter.setView(this)
}

仅此而已,

快乐编码

最新更新