如何使用copy函数仅更新LoginModel的login字段且保留password
解决方法
要实现仅更新loginModel中的login字段且保留password字段,需要利用Kotlin data class的copy()方法——该方法会复制对象的所有现有字段值,仅替换指定的参数。
修改LoginViewModel中的onClickLogin函数如下:
private fun onClickLogin() { updateState { currentState -> currentState.value?.let { currentUiState -> currentState.value = currentUiState.copy( loginModel = currentUiState.loginModel.copy(login = "d") ) } } }
原理说明
- 通过
currentState.value?.let安全获取当前的LoginUiState实例,避免空指针异常 - 调用
currentUiState.copy()创建新的LoginUiState对象,其中loginModel字段不再直接新建LoginModel,而是基于**当前已有的loginModel**调用copy(login = "d") loginModel.copy(login = "d")会生成一个新的LoginModel对象:保留原对象的password值,仅将login字段更新为"d"
如果偏好更简洁的写法,也可以直接链式调用(可读性稍弱):
private fun onClickLogin() { updateState { currentState -> currentState.value = currentState.value?.copy( loginModel = currentState.value.loginModel.copy(login = "d") ) } }
内容的提问来源于stack exchange,提问作者Yurii Dekhtiar
相关产品推荐
相关产品推荐

