MVP с компонентом ViewModel - PullRequest
       53

MVP с компонентом ViewModel

0 голосов
/ 06 марта 2020

Отказ от ответственности: Это не сообщение MVP против MVVM.

Я сделал простой проект, чтобы посмотреть, как работает MVP

Моя активность :

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

My Presenter :

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

}

При изменении конфигурации (ориентации) мой номер сбрасывается. Я знаю, что это нормальное поведение, поскольку активность отбрасывается и воссоздается. Я читал, что viewmodel разработан, чтобы помочь выжить данным. Однако я не знаю, как реализовать это с моим докладчиком.

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Я бы порекомендовал следующий подход

Сначала создайте базовый интерфейс презентатора, как показано ниже

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

Затем, при желании, вы можете создать интерфейс базового вида с помощью базовых c операций * 1006. *

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

И ваш класс презентатора должен выглядеть следующим образом:

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 - ViewModel в A C «предназначен для хранения и управления пользовательским интерфейсом» данные в сознательном жизненном цикле », и это именно то, чего мы хотим достичь

Расширяя ViewModel, экземпляр Presenter переживет изменения конфигурации

Передавая и наблюдая viewLifecycle, каждый Presenter автоматически устанавливает свой вид ссылка на ноль до уничтожения представления

Статья e xplaining в деталях

0 голосов
/ 18 марта 2020

В итоге я переработал свое приложение и решил go напрямую с MVVM и последовал этот курс

...