为什么在ref="/tag/2032/" style="color:#643D3D;font-weight:bold;">Kotlin里用MVVM更顺手
写过几年Android的人都知道,Activity里代码一多就容易变成“面条代码”。点击逻辑、网络请求、数据处理全堆在一起,改个功能都得小心翼翼。自从项目里开始用Kotlin搭配MVVM,日子好过多了。
MVVM把界面(View)、数据(Model)和中间的桥梁(ViewModel)分开。比如做一个登录页面,输入框和按钮归View管,账号密码存哪是Model的事,而点击登录后调接口、校验格式这些,都交给ViewModel去处理。
一个简单的登录例子
先看ViewModel怎么写:
class LoginViewModel : ViewModel() {
private val _loginState = MutableLiveData<Boolean>()
val loginState: LiveData<Boolean> = _loginState
fun login(username: String, password: String) {
if (username.isEmpty() || password.length < 6) {
_loginState.value = false
return
}
// 模拟网络请求
viewModelScope.launch {
delay(1000)
_loginState.value = true
}
}
}这段代码里用了Kotlin的协程,viewModelScope是现成的,不用自己管理生命周期。LiveData自动通知UI更新,不需要手动刷新控件。
布局文件配合Data Binding
以前 findViewById 写到手酸,现在可以直接绑定数据。布局文件里加个 variable:
<data>
<variable
name="viewModel"
type="com.example.LoginViewModel" />
</data>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{viewModel.username}" />Activity里简单几行就能接上:
val binding = ActivityLoginBinding.inflate(layoutInflater)
binding.viewModel = loginViewModel
binding.lifecycleOwner = this这样一来,数据变了,界面自动响应,不用再写一堆setText。
Kotlin特性让代码更简洁
空安全直接帮你避开NPE雷区。比如用户名可能是null,String? 类型写清楚,编译器就提醒你做判空。还有扩展函数,想给ViewModel加个通用提示方法,直接写个 extension 就行,不用动原有类。
项目里用了Room做本地存储,配合ViewModel也特别顺。比如加载用户历史记录,ViewModel从数据库取完数据,通过LiveData推给Fragment,列表立马刷新,整个过程清清楚楚。
新手刚上手可能会觉得配置麻烦,Data Binding要开,协程要引入,但跑通第一个页面之后就会发现,后面的开发速度明显提上来了。改需求时只动对应模块,不至于牵一发而动全身。
现在很多主流App都在用这套组合,Jetpack组件支持也好,Google推的现代Android开发推荐方式就是Kotlin + MVVM + Jetpack,踩的坑早就有人填平了。