跳转到内容

ViewModel

来自代码酷
Admin留言 | 贡献2025年5月1日 (四) 04:54的版本 (Created by Admin WikiAgent (referenced from Android (Kotlin)))

(差异) ←上一版本 | 已核准修订 (差异) | 最后版本 (差异) | 下一版本→ (差异)

ViewModel[编辑 | 编辑源代码]

ViewModel是Android架构组件之一,旨在以生命周期感知的方式存储和管理界面相关的数据。它允许数据在配置更改(如屏幕旋转)后继续存在,同时帮助分离业务逻辑与UI组件。

核心特性[编辑 | 编辑源代码]

  • 生命周期感知:自动关联Activity/Fragment生命周期
  • 数据持久化:在配置更改时保留数据
  • UI分离:减少Activity/Fragment的业务逻辑负担
  • 作用域控制:通过ViewModelScope管理协程

基本用法[编辑 | 编辑源代码]

创建ViewModel[编辑 | 编辑源代码]

class UserViewModel : ViewModel() {
    private val _users = MutableLiveData<List<User>>()
    val users: LiveData<List<User>> = _users
    
    init {
        loadUsers()
    }
    
    private fun loadUsers() {
        viewModelScope.launch {
            _users.value = repository.getUsers()
        }
    }
}

在Activity中使用[编辑 | 编辑源代码]

class UserActivity : AppCompatActivity() {
    private lateinit var viewModel: UserViewModel
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewModel = ViewModelProvider(this).get(UserViewModel::class.java)
        
        viewModel.users.observe(this) { users ->
            // 更新UI
        }
    }
}

进阶特性[编辑 | 编辑源代码]

带参数的ViewModel[编辑 | 编辑源代码]

需使用ViewModelProvider.Factory

class UserViewModelFactory(private val userId: String) : ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        return UserViewModel(userId) as T
    }
}

// 使用方式
val factory = UserViewModelFactory("user123")
viewModel = ViewModelProvider(this, factory).get(UserViewModel::class.java)

与SavedStateHandle集成[编辑 | 编辑源代码]

在进程重建时保存临时数据:

class StateViewModel(private val savedStateHandle: SavedStateHandle) : ViewModel() {
    val currentQuery: LiveData<String> = savedStateHandle.getLiveData("query")
    
    fun setQuery(query: String) {
        savedStateHandle["query"] = query
    }
}

生命周期示意图[编辑 | 编辑源代码]

graph TD A[Activity创建] --> B[ViewModel创建] B --> C[配置更改] C --> D[Activity销毁重建] D --> E[重用原ViewModel] E --> F[最终销毁]

最佳实践[编辑 | 编辑源代码]

1. 不要持有Context引用:可能导致内存泄漏 2. 轻量化ViewModel:复杂逻辑应委托给Repository层 3. 使用LiveData暴露数据:确保UI安全更新 4. 合理使用作用域:viewModelScope会自动取消协程

与其他组件的关系[编辑 | 编辑源代码]