Kotlin的基本使用和基类封装、MVVM和DataBinding

犹豫要不要写这篇关于Kotlin的文章很久了,网上大把大把的Kotlin的项目和各种知识点与代码,到目前为止已经半年多没接触Kotlin项目了,重新捡起来,就当是熟悉一下基本写法吧,以文章的形式去整理并加深一下印象,同时可以帮助一下正在初学Kotlin的同学。

这篇文章你可以了解到
1.Kotlin基本使用
2.Kotlin项目基类搭建封装
3.MVVM框架实战使用
4.DataBinding数据绑定实战

首先讲一下MVVM是很有必要的,因为一开始我接触到Kotlin就是与MVVM配合使用的,如果你和我说用Kotlin来写一个项目吧,用什么框架呢,我会毫不犹豫的说用MVVM,不是其他框架用不了,不好用,我感觉MVVM就是为Kotlin而生的!

MVVM与MVP、MVC这里就不介绍了

MVVM与MVP的区别呢?
个人感觉其实区别不大,视图层,逻辑层,数据层
但是又有很大的区别,MVVM有JetPack加持,并且更多的和Kotlin一起使用,
JetPack与Kotlin碰撞出 简洁+封装工具的火花 - DataBinding、ViewModel、LiveData等工具都源自JetPack这个组件库,使MVVM更加简洁同时也更加解耦

如何创建一个Kotlin项目这里就不说了吧…

准备开发条件:

  1. 打开DataBinding
    build.gradle - android 内添加
 dataBinding {
        enabled = true
    }
  1. 引入ViewModel(这就是MVVM中的VM基础)
    build.gradle - dependencies 内添加
  implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'

开发条件准备好了,接下来该搭基础了,也就是基类,MVVM更多的是创建三个基类

  1. Activity的基类
  2. ViewModel的基类
  3. Model的基类

不要感觉这个这么多基类用起来得多麻烦,基类的目的就是为了减少代码量,提高开发效率的,有了合适的基类,以后的开发中就是复制粘贴的事情了,成功从脑力活转为体力活,哈哈

因为M与VM想关联,VM与V相关联,所以他们的基类也要保持此关系
由简到难
Kotlin的基本使用和基类封装、MVVM和DataBinding_第1张图片

Model的基类
Kotlin的基本使用和基类封装、MVVM和DataBinding_第2张图片

abstract class ModelBase

ViewModel的基类

Kotlin的基本使用和基类封装、MVVM和DataBinding_第3张图片

abstract class ViewModelBase<M: ModelBase>(
    val mModel: M
): ViewModel()

来了来了,它来了,可以看到此时以M的基类作为泛型,因为所有的M都是在基类的基础上的,此时又在参数中添加泛型类的 Model,目的是为了在新建VM的时候就自动和M建立联系,直接拿来用就行。。本人技术有限,以这种形式去声明相关联系,以后在慢慢优化此问题。。个人在使用中暂未感觉到不适,哈哈,

Activity的基类

在写Activity的基类之前先说一下如何去绑定DataBinding和XMl布局文件,以及声明ViewModel

  1. 绑定DataBinding和XMl布局文件
DataBindingUtil.setContentView(this, layoutId)

简单吧,就一句代码,其实绑定方式有很多, 咱就用这种呗

  1. 声明ViewModel
ViewModelProvider(this).get(viewModel::class.java)

简单吧,就一句代码,其中viewModel为我们对应的viewModel类

上代码
Kotlin的基本使用和基类封装、MVVM和DataBinding_第4张图片

abstract class ActivityBase<V: ViewDataBinding,VM: ViewModel> (
    var layoutId: Int,
    var viewModel: VM
) : AppCompatActivity() {

    lateinit var mDataBind: V
    lateinit var mViewModel: VM

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mDataBind = DataBindingUtil.setContentView(this, layoutId)
        initViewModel()
        initData()
    }

    private fun initViewModel(){
        mViewModel = ViewModelProvider(this).get(viewModel::class.java)
    }
    open fun initData(){

    }
}

同样以泛型和参数的方式为其进行声明,技术有限,正常不需要参数才对。。此时希望有大佬能够指点下

注意!!如果很荣幸您要使用此基类,请注意要在 V 中将 xml里面数据绑定与此基类中的ViewModel进行赋值,否则xml数据绑定时与ViewModel并没有建立联系 ( mDataBind.viewModel = mViewModel
),下文将明确标出

基类封装以上就完成了,接下来说一下如何使用DataBinding

打开布局文件 - 全选布局代码 - Alt+Enter - Convert to data binding layout

此时你的布局文件转为数据绑定布局了

此时在xml头部添加
Kotlin的基本使用和基类封装、MVVM和DataBinding_第5张图片

要想在布局文件里进行操作,比如显示隐藏,需要导入View

<import type="android.view.View"/>

数据绑定来了

<variable
      name="viewModel"
      type="com.example.mykotlin.MainViewModel" />

其中name为你在布局文件引用时的名字,type为你引用的类,就是与这个类里面的数据进行交互

介绍一下基本使用

  1. 绑定文本
  2. 点击事件
  3. 显示隐藏

Kotlin的基本使用和基类封装、MVVM和DataBinding_第6张图片
看到了吧,对应的地方通过 @{ } 方式,通过名字引入该类里面的数据,进行操作,你看id都不用了呢

此时基本的DataBinding与xml交互已经完成了,现在就剩实际代码了

MainActivity
Kotlin的基本使用和基类封装、MVVM和DataBinding_第7张图片

@SuppressLint("SetTextI18n")
class MainActivity : ActivityBase<ActivityMainBinding,MainViewModel>(
    R.layout.activity_main,
    MainViewModel()
) {

    override fun initData() {
        //这里需要单独为xml与ViewModel进行绑定
        mDataBind.viewModel = mViewModel
        mViewModel.myText.set(mViewModel.str)
    }

}

MainViewModel

Kotlin的基本使用和基类封装、MVVM和DataBinding_第8张图片

class MainViewModel: ViewModelBase<MainModel>(
    MainModel()
){

    var str = "我是一个文本框"
    var text = "我被点击了"

    var myShow = ObservableField<Boolean>(true) //是否显示清除用户名图标
    var myText: ObservableField<String> = ObservableField("") //用户名文本框数据绑定

    fun onClick(v: View){
        myText.set(if (myShow.get()!!) text else str)
        myShow.set(!myShow.get()!!)
    }

}

MainModel

Kotlin的基本使用和基类封装、MVVM和DataBinding_第9张图片

class MainModel: ModelBase() {
}

此时全部代码已经写完了,看一下效果吧

点击我是一个文本框之后,文本框文文字改变,下面隐藏,再次点击之后,恢复原状 Kotlin的基本使用和基类封装、MVVM和DataBinding_第10张图片
Kotlin的基本使用和基类封装、MVVM和DataBinding都会用了,不去隔壁看看LiveData二次封装、Kotlin中使用简单吗?

为了方便以后使用,将上述基类已经上传到 JitPack

implementation 'com.github.ZhaoChanghu:PublicBase:1.2.2'

依赖都会用了,不去隔壁看看怎么自己创建依赖吗?Android项目以依赖的形式使用

以上有任何可以优化的问题,以及想要了解的问题,随时可以评论交流一下

你可能感兴趣的:(Kotlin,android,Kotlin,MVVM,DataBinding,基类写法)