犹豫要不要写这篇关于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项目这里就不说了吧…
准备开发条件:
dataBinding {
enabled = true
}
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
开发条件准备好了,接下来该搭基础了,也就是基类,MVVM更多的是创建三个基类
不要感觉这个这么多基类用起来得多麻烦,基类的目的就是为了减少代码量,提高开发效率的,有了合适的基类,以后的开发中就是复制粘贴的事情了,成功从脑力活转为体力活,哈哈
因为M与VM想关联,VM与V相关联,所以他们的基类也要保持此关系
由简到难
abstract class ModelBase
ViewModel的基类
abstract class ViewModelBase<M: ModelBase>(
val mModel: M
): ViewModel()
来了来了,它来了,可以看到此时以M的基类作为泛型,因为所有的M都是在基类的基础上的,此时又在参数中添加泛型类的 Model,目的是为了在新建VM的时候就自动和M建立联系,直接拿来用就行。。本人技术有限,以这种形式去声明相关联系,以后在慢慢优化此问题。。个人在使用中暂未感觉到不适,哈哈,
Activity的基类
在写Activity的基类之前先说一下如何去绑定DataBinding和XMl布局文件,以及声明ViewModel
DataBindingUtil.setContentView(this, layoutId)
简单吧,就一句代码,其实绑定方式有很多, 咱就用这种呗
ViewModelProvider(this).get(viewModel::class.java)
简单吧,就一句代码,其中viewModel为我们对应的viewModel类
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
此时你的布局文件转为数据绑定布局了
要想在布局文件里进行操作,比如显示隐藏,需要导入View
<import type="android.view.View"/>
数据绑定来了
<variable
name="viewModel"
type="com.example.mykotlin.MainViewModel" />
其中name为你在布局文件引用时的名字,type为你引用的类,就是与这个类里面的数据进行交互
介绍一下基本使用
看到了吧,对应的地方通过 @{ } 方式,通过名字引入该类里面的数据,进行操作,你看id都不用了呢
此时基本的DataBinding与xml交互已经完成了,现在就剩实际代码了
@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
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
class MainModel: ModelBase() {
}
此时全部代码已经写完了,看一下效果吧
点击我是一个文本框之后,文本框文文字改变,下面隐藏,再次点击之后,恢复原状
Kotlin的基本使用和基类封装、MVVM和DataBinding都会用了,不去隔壁看看LiveData二次封装、Kotlin中使用简单吗?
为了方便以后使用,将上述基类已经上传到 JitPack
implementation 'com.github.ZhaoChanghu:PublicBase:1.2.2'
依赖都会用了,不去隔壁看看怎么自己创建依赖吗?Android项目以依赖的形式使用
以上有任何可以优化的问题,以及想要了解的问题,随时可以评论交流一下