我想将inject
和view (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)
}
仅此而已,
快乐编码