【问题标题】:how to inject view into the presenter using Dagger2 for android?如何使用 Dagger2 for android 将视图注入演示者?
【发布时间】:2020-05-01 20:20:03
【问题描述】:

我想把injectview (Activity object)变成Presenter。现在我正在使用 Presenter 类的设置器手动设置视图。如何使用 Dagger 实现这一目标?你能告诉我一个关于如何做的示例代码吗?

这就是目前主 Activity 创建 Presenter 的方式

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();
            }
        });
    }
}

**Presenter 类代码:**

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

【问题讨论】:

  • 发布您的演示者模块!
  • 我已经提供了我的项目的链接..

标签: android dependency-injection dependencies dagger


【解决方案1】:

我要写下步骤

首先,你需要添加一个module

@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)
}

并被匕首/注射的魔法逗乐。

Java 中的第 2 部分

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

【讨论】:

  • 能否请您提供java代码用于“添加新添加模块的引用”部分代码...
【解决方案2】:

嘿嘿, 这是我在 Kotlin 中的解决方案。第一的 你将创建一个界面

接口契约{

    interface Presenter{
    fun setView(view: View)
}

}

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

: Contract.Presenter 

在 Presenter 中,你将创建 View 类型的后期初始化 var 视图

 private lateinit var view: View

然后在presenter接口的实现中,你会定义这个

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

在 MainActivity 你将拥有

@注入 lateinit var presenter: Contract.Presenter

在简历中,您将其设置为视图

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

就是这样,

愉快的编码

【讨论】:

    猜你喜欢
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多