带有 ViewModel 组件的 MVP

MVP with ViewModel component

免责声明:这不是 MVP 与 MVVM post。

我做了一个简单的项目来了解 MVP 的工作原理

我的Activity:

class MainActivity : AppCompatActivity(), MainContract.View {

    lateinit var presenter: MainPresenter
    private val counter by lazy { findViewById<TextView>(R.id.value_tv) }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        presenter = MainPresenter(this)

        increment_value_btn.setOnClickListener {
            presenter.incrementCount()
        }

        decrement_value_btn.setOnClickListener {
            presenter.decrementCount()
        }

    }

    override fun updateCount(count: Int) {
        counter.text = count.toString()
    }
}

我的主持人:

class MainPresenter(mainView: View) : Presenter {

    var view: View = mainView
    var counter: Int = 0

    override fun incrementCount() {
        counter++
        view.updateCount(counter)
    }

    override fun decrementCount() {
        counter--
        view.updateCount(counter)
    }

}

当配置更改(方向)时,我的号码将被重置。我知道这是正常行为,因为 activity 被删除并重新创建。我读到 viewmodel 旨在帮助数据保存。但是我不知道如何用我的演示者实现它。

我会推荐以下方法

首先创建一个如下所示的基本演示界面

interface BasePresenter<View : BaseView> : LifecycleObserver {
        var view: View?
        var viewLifecycle: Lifecycle?

        @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
        fun attachView(view: View, viewLifecycle: Lifecycle?) {
            this.view = view
            this.viewLifecycle = viewLifecycle
            viewLifecycle?.addObserver(this)
        }

        @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
        override fun onViewDestroyed() {
         view = null
         viewLifecycle = null
        }
 }

然后您可以选择使用基本操作创建一个基本视图界面

  interface BaseView {
    fun showProgressDialog()
    fun hideProgressDialog()
 }

你的主持人 class 应该看起来像

class MainPresenter() : BasePresenter<MainView> {

    var counter: Int = 0

    override fun incrementCount() {
        counter++
        view?.updateCount(counter)
    }

    override fun decrementCount() {
        counter--
        view?.updateCount(counter)
    }

}

然后无论你在哪里初始化演示者实例,都不要忘记附加视图实现,如下所示

presenter.attachView(this, lifecycle)

这个实现的解释

Presenter 扩展 ViewModel 可能看起来很奇怪,但我们不要将它与 ViewModel 混淆 来自 MVVM - AC 中的 ViewModel “旨在以生命周期意识的方式存储和管理 UI 相关数据”, 这正是我们想要实现的目标

通过扩展 ViewModel,Presenter 实例将在配置更改后继续存在

通过传递和观察 viewLifecycle,每个 Presenter 都会在视图被销毁之前自动将其视图引用设置为 null

Article explaining in detail

最后我修改了我的应用程序并决定直接使用 MVVM 并遵循 this course