MVVM简介
MVVM分为Model、View、ViewModel,它们的作用分别为:
Model:简称数据模型,包括从服务端获取的json数据,bean,或者从本地获取的数据等等;
View:UI视图,负责数据的显示(activity,fragment,控件view等等);
ViewModel:就是与界面(view)对应的Model,View与Model通过ViewModel实现数据的双向绑定。进行数据的绑定和逻辑的代码的实现
MVVM 的优点
主要目的是分离视图(View)和模型(Model)
降低代码耦合,提高视图或者逻辑的重用性。
提高了模块的可测试性
ViewModel: 负责管理数据的抽象类,通过ViewBinding 中的setVariable 方法绑定绑定到View层 进行页面更新。
ViewModel 的生命周期会从创建绑定到Activity/Fragment 中开始 一直到Activity/Fragment 的onDestroy 结束,所以,不需要担心数据在
使用过程中丢失。
Model: 负责业务逻辑处理,如网络请求、数据库、耗时等操作,通常model 层会和ViewModel 使用同一个类进行封装处理,这样的好处在与,当model中的数据处理完毕拿到结果时,可以通知ViewModel 中需要更新的变量进行更新,再者ViewModel 会通知View 刷新更改页面的值。
View: 负责页面展示,在Activity\Fragment 创建时,通过binding.setVariable()的方式 将ViewModel 绑定到页面布局中。从而打到双向绑定的效果。
导入相关包以及gradle 配置
1、kotlin 和viewmodel 相关
api 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0' //viewmodel
api 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.0'
api 'androidx.appcompat:appcompat:1.6.0-alpha05'
api 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1' //协程
api 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1'
api 'androidx.core:core-ktx:1.8.0' //kt
api 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.2'//rxlifecycler
1
2、子目录下的build.gradle中配置,以下不配置的话,kotlin 会报错。
plugins {
id 'org.jetbrains.kotlin.android'
}
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
kapt {
generateStubs = true
}
//开启databinding
android{
buildFeatures{
dataBinding = true
}
}
3、根目录build.gradle 配置
ext.kotlin_version ='1.7.0'
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.21"
}
plugins {
id 'com.android.application' version '7.1.3' apply false
id 'com.android.library' version '7.1.3' apply false
id 'org.jetbrains.kotlin.android' version '1.6.21' apply false
// id 'org.jetbrains.kotlin:kotlin-gradle-plugin' version '1.7.0' apply false
}
4、gradle.properties 中配置
android.useAndroidX=true
kotlin.code.style=official
android.enableJetifier=true//表示Android插件会通过重写其二进制文件来自动迁移现有的第三方库,以使用AndroidX依赖项;未设置时默认为false;
//必要配置项enableJetifier
base 封装
1、先看看大致也结构:
在这里插入图片描述
BaseActivity\BaseFragment代表View层,也就是直观看到界面组件
BaseViewModel Model层和ViewModel 的组成
IBaseViewModel 实现LifecycleObserver的一个自定义接口,让BaseViewModel 同样能感知组件的生命周期,方便我们在生命周期中处理一下逻辑。
2、封装
BaseActivity
package com.kt.ktmvvm.basic
import android.content.Intent
import android.os.Bundle
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.kt.ktmvvm.basic.BaseViewModel.Companion.ParameterField.BUNDLE
import com.kt.ktmvvm.basic.BaseViewModel.Companion.ParameterField.CLASS
import com.kt.ktmvvm.basic.BaseViewModel.Companion.ParameterField.REQUEST
import com.trello.rxlifecycle2.components.support.RxAppCompatActivity
import java.lang.reflect.ParameterizedType
abstract class BaseActivity<V : ViewDataBinding, VM : BaseViewModel> : RxAppCompatActivity(),
IBaseView {
open var binding: V? = null
open var viewModel: VM? = null
open var viewModelId = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
initViewDataBinding(savedInstanceState)
//页面接受的参数方法
initParam()
//私有的ViewModel与View的契约事件回调逻辑
registerUIChangeLiveDataCallBack()
//页面事件监听的方法,一般用于ViewModel层转到View层的事件注册
initViewObservable()
}
private fun registerUIChangeLiveDataCallBack() {
//跳入新页面
viewModel?.getUC()?.getStartActivityEvent()?.observe(this) { params ->
params?.let {
val clz = params[CLASS] as Class<*>?
val intent = Intent(this@BaseActivity, clz)
// intent.addFlags(Intent.FLAG_ACTIV