Когда я использую MvRx для создания представлений профиля пользователя, он работает почти нормально, но один случай заставляет меня задуматься, почему локальные переменные не могут быть обновлены при вызове onClick?
В частности, когда действие профиля возобновляется с действия редактирования имени, представления, использующие имя, обновляются до нового имени, но onClick {} не объясняет, почему?
// profile activity
ProfileActivity ...{
// ...
inner class MyController : TypedEpoxyController<MyState>() {
override fun buildModels(data: MyState?) {
data?.xxx?.let { info ->
myView {
id("name")
title(R.string.xxx)
val name = info.name.takeIf { it.isNotEmpty() } ?: "Name"
label(name) // updated
onClick {
// wrong
val currentName = name // not updated
// correct
withState(myViewModel) { newState ->
val currentName = newState.xxx?.name?.takeIf { it.isNotEmpty() } ?: "Name"
startActivityForResult(// edit name activity, REQUEST_CODE_NAME)
}
}
}
// ...
}
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == RESULT_OK) {
when (requestCode) {
REQUEST_CODE_NAME -> {
myViewModel.setXXX(name = xxx) // update name
}
}
}
}
}
// myView
@ModelView(defaultLayout = xxx)
class MyView ... {
@TextProp
fun setUserName(userName: CharSequence?) {
tvUserName.text = userName
}
@CallbackProp
fun onClick(@Nullable action: (() -> Unit)?) {
throttleClick {
action?.invoke()
}
}
// ...
}