CLAUDE.md 5.2 KB

MVVM 模块

模块概述

MVVM 模块是基于 Android Architecture Components 的 MVVM 架构扩展模块,提供了增强的 ViewModel、LiveData 变体、生命周期管理和视图组件抽象。该模块简化了 MVVM 架构的实现,并提供了更强大的数据绑定和生命周期管理能力。

主要功能

1. 增强的 ViewModel

  • BaseViewModel: 扩展的 ViewModel 基类
  • 支持协程作用域管理
  • 提供 LiveData 数据发送的便捷方法
  • 自动资源清理和生命周期管理

2. LiveData 扩展

  • NonNullLiveData: 非空 LiveData 实现
  • ExtLiveData: 扩展功能的 LiveData
  • OnceMutableLiveData: 单次触发的 LiveData
  • NoSendCacheValueLiveData: 无缓存值发送的 LiveData
  • ActiveMutableLiveData: 激活状态管理的 LiveData

3. 生命周期管理

  • ViewComponent: 视图组件抽象类
  • LifecycleOwnerExt: 生命周期扩展函数
  • ViewScope: 视图范围管理
  • 支持 Activity 和 Fragment 的统一生命周期管理

4. 视图绑定支持

  • ViewBindingExt: ViewBinding 扩展函数
  • IViewComponent: 视图组件接口定义
  • 简化视图绑定的使用

5. 资源管理

  • Disposable: 可释放资源接口
  • RunnableDisposable: 可运行资源管理
  • 自动资源清理机制

核心类和接口

BaseViewModel

abstract class BaseViewModel : ViewModel() {
    val viewModelScope: CoroutineScope
    
    protected fun <T> LiveData<T>.send(value: T, postCover: Boolean = true)
    
    override fun onCleared()
}

ViewComponent

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()
    // ... 其他生命周期方法
}

NonNullLiveData
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 // 保证返回非空值
}

使用方式

1. 使用 BaseViewModel

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)
        }
    }
}

2. 使用 ViewComponent

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()
}

3. 使用非空 LiveData

class DataRepository {
    private val _status = NonNullLiveData("idle")
    val status: LiveData<String> = _status
    
    fun updateStatus(newStatus: String) {
        _status.value = newStatus
        // getValue() 保证返回非空值
        val currentStatus = _status.value // 不需要空判断
    }
}

4. LiveData 扩展使用

// 一次性事件
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 - 工具类模块

功能特性

  • ViewBinding: 模块启用了 ViewBinding 支持
  • 生命周期感知: 自动管理组件生命周期
  • 协程集成: 与协程无缝集成
  • 资源管理: 自动清理资源防止内存泄漏

构建配置

implementation "com.wenext.android:frame-mvvm:6.0.0"

注意事项

  1. 生命周期管理: ViewComponent 自动处理生命周期,但仍需注意正确的使用时机
  2. 协程作用域: BaseViewModel 的 viewModelScope 会在 ViewModel 清理时自动取消
  3. 内存泄漏: 使用 ViewComponent 时确保在适当的时候清理引用
  4. 线程安全: LiveData 的 send 方法会根据当前线程自动选择合适的更新方式
  5. 状态保存: ViewComponent 支持状态保存和恢复机制
  6. 有效性检查: 使用 isValid 属性检查组件是否仍然有效,避免在无效状态下操作