带有 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
最后我修改了我的应用程序并决定直接使用 MVVM 并遵循 this course
免责声明:这不是 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
最后我修改了我的应用程序并决定直接使用 MVVM 并遵循 this course