MVVM 模块是基于 Android Architecture Components 的 MVVM 架构扩展模块,提供了增强的 ViewModel、LiveData 变体、生命周期管理和视图组件抽象。该模块简化了 MVVM 架构的实现,并提供了更强大的数据绑定和生命周期管理能力。
abstract class BaseViewModel : ViewModel() {
val viewModelScope: CoroutineScope
protected fun <T> LiveData<T>.send(value: T, postCover: Boolean = true)
override fun onCleared()
}
abstract class ViewComponent(
override val lifecycleOwner: LifecycleOwner,
) : LifecycleOwner, LifecycleObserver, IViewComponent {
val activity: FragmentActivity?
val fragment: Fragment?
val isValid: Boolean
val viewLifecycleOwner: LifecycleOwner
fun attach(): ViewComponent
protected open fun onCreate()
protected open fun onStart()
// ... 其他生命周期方法
}
open class NonNullLiveData<T>(default: T) : NonNullReadOnlyLiveData<T>(default) {
public override fun postValue(value: T)
public override fun setValue(value: T)
override fun getValue(): T // 保证返回非空值
}
class MyViewModel : BaseViewModel() {
private val _data = MutableLiveData<String>()
val data: LiveData<String> = _data
fun updateData(newValue: String) {
// 使用增强的 send 方法
_data.send(newValue)
}
fun loadDataAsync() {
viewModelScope.launch {
// 在协程中执行异步操作
val result = loadDataFromNetwork()
_data.send(result)
}
}
}
class MyViewComponent(lifecycleOwner: LifecycleOwner) : ViewComponent(lifecycleOwner) {
override fun onCreate() {
super.onCreate()
// 初始化操作
}
override fun onResume() {
super.onResume()
// 恢复操作
}
fun performAction() {
if (isValid) {
// 执行需要有效上下文的操作
requireActivity().finish()
}
}
}
// 在 Activity 或 Fragment 中使用
class MainActivity : AppCompatActivity() {
private val viewComponent = MyViewComponent(this).attach()
}
class DataRepository {
private val _status = NonNullLiveData("idle")
val status: LiveData<String> = _status
fun updateStatus(newStatus: String) {
_status.value = newStatus
// getValue() 保证返回非空值
val currentStatus = _status.value // 不需要空判断
}
}
// 一次性事件
private val _navigationEvent = OnceMutableLiveData<String>()
val navigationEvent: LiveData<String> = _navigationEvent
// 观察者只会收到一次事件
_navigationEvent.observe(this) { destination ->
// 只触发一次
navigate(destination)
}
androidx.lifecycle.viewmodel.ktx - ViewModel 支持androidx.lifecycle.livedata.ktx - LiveData 支持androidx.lifecycle.common.java8 - Java8 生命周期支持androidx.core.ktx - Android Core 扩展androidx.appcompat - AppCompat 支持frame:coroutine - 协程工具模块frame:util - 工具类模块implementation "com.wenext.android:frame-mvvm:6.0.0"