【问题标题】:ViewModel value change handlers code duplicationViewModel 值更改处理程序代码重复
【发布时间】:2021-10-13 04:52:29
【问题描述】:

我有以下 ViewModel:

data class Input(
  val email: String = "",
  val password: String = ""
)

class LoginViewModel : ViewModel() {
  private val _input = MutableStateFlow(Input())
  val input = _input.asStateFlow()

  fun onEmailChange(value: String) {
      _input.value = _input.value.copy(email = value)
  }

  fun onPasswordChange(value: String) {
      _input.value = _input.value.copy(password = value)
  }
}

我不喜欢onEmailChange 和onPasswordChange 的方法,因为我必须为Input 类的每个属性复制这样的代码。我想知道我是否可以让它更短并且没有代码重复?

我的可组合:

@Composable
fun LoginScreen(loginViewModel: LoginViewModel = viewModel()) {
    val input by loginViewModel.input.collectAsState()
    Column {
        TextField(
            label = { Text("Email") },
            value = input.email,
            onValueChange = loginViewModel::onEmailChange,
            singleLine = true
        )
        TextField(
            label = { Text("Password") },
            value = input.password,
            onValueChange = loginViewModel::onPasswordChange,
            singleLine = true
        )
    }
}

【问题讨论】:

  • 这种重复可能没什么问题?

标签: android kotlin android-jetpack-compose


【解决方案1】:

你可以改成这样:

fun onInputChange(
    email: String? = null,
    password: String? = null
) {
    val oldInput = _input.value
    _input.value = oldInput.copy(
        email = email ?: oldInput.email,
        password = password ?: oldInput.password,
    )
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    相关资源
    最近更新 更多