500*_*865 1 android kotlin android-jetpack-compose
所以,这是我所处的一个有趣的情况:
ComposableA(CA) 使用ComposableB参数 调用 (CB) email。在ComposableB,我想要有一个emailError state依赖email。每次email更改(或像 FocusChange 这样的其他事件)时,我想重新计算emailError状态并强制重新组合Composable.
在 中CB,如果我使用derivedStateOf或mutableStateOf不记住,我会收到如下 linter 错误:
我可以通过添加@SuppressLint("UnrememberedMutableState")注释来抑制这种情况,但这不会强制重新计算状态,即使焦点或电子邮件发生变化也是如此。如果我只使用变量,则组合引擎不会知道可组合 UI 取决于该值,并且即使值发生变化也不会重新组合它。
这是代码:
ComposableB
fun CB(
emailValue: TextFieldValue = TextFieldValue("", TextRange.Zero),
onEmailChanged: (emailValue: TextFieldValue) -> Unit = {},
focusedTextField: FeatTextField = FeatTextField.Email,
onFocusedTextField: (textField: FeatTextField) -> Unit = {}
) {
// Error is derived from emailAddress
val emailError by derivedStateOf {
Timber.tag("StateTest").i("EmailValue: ${emailValue.text}")
focusedTextField != SignInTextField.Email && !Validator.validateEmail(emailValue.text)
}
... Rest of the code that renders the composable using focusedTextField, email and emailError values
Run Code Online (Sandbox Code Playgroud)
ComposableA
.... Maintains the state and calls CB
fun CA(
emailValue = emailValue,
onEmailChanged = { vm.newUiState(copy(emailValue = it)) },
focusedTextField = focusedTextField,
onFocusedTextField = { focusedTextField = it }
)
Run Code Online (Sandbox Code Playgroud)
我可以将错误作为参数之一并提升状态,CA但我试图避免这种情况,因为我想保持 CB 尽可能独立。
任何指示表示赞赏。
谢谢你!
mutableStateOf,derivedStateOf和rememberUpdateState。简而言之,您不应该使用derivedStateOf,甚至可能不需要remember。
derivedStateOf仅当表达式读取可变状态值时才应使用。如果没有读取可变状态值,则不derivedStateOf提供任何值,并且是您不需要的开销。此外,derivedStateOf只有当生成的值的变化频率低于其读取的数据时,它才真正有用。
如果参数值不经常更改,那么您可能只需要正常跳过可组合函数即可。CB仅当其参数之一发生变化时才会执行(假设它们都稳定)。
但是,如果其中一个参数变化很大并且不是昂贵计算的一部分,请考虑用于remember昂贵计算。请务必将正在更改的值作为参数传递,remember以便 Compose 知道何时重新评估记住的表达式。例如,
val emailError by remember(emailValue.text, focusedTextField) {
Timber.tag("StateTest").i("EmailValue: ${emailValue.text}")
focusedTextField != SignInTextField.Email && !Validator.validateEmail(emailValue.text)
}
Run Code Online (Sandbox Code Playgroud)
然而,如上所述,由于这两个参数是唯一可能发生变化的参数,因此跳过 Compose 已经执行的操作可能就足够了。
文章https://stefma.medium.com/jetpack-compose-remember-mutablestateof-drivenstateof-and-remembersaveable-explained-270dbaa61b8对此进行了更详细的介绍。
| 归档时间: |
|
| 查看次数: |
751 次 |
| 最近记录: |