Почему локальные переменные не могут обновляться только при вызове onClick в MvRx - PullRequest
0 голосов
/ 21 февраля 2020

Когда я использую 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()
        }
    }

// ...

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...