我只想在可组合加载时运行一次代码。所以我使用 LaunchedEffect with key as true 来实现这一点。
LaunchedEffect(true) {
// do API call
}
此代码工作正常,但只要有任何配置更改(如屏幕旋转),此代码就会再次执行。如果配置更改,如何防止它再次运行?
最佳答案
最简单的解决方案是存储有关您是否使用 rememberSaveable
进行 API 调用的信息。 : 当配置改变时它会生效。
var initialApiCalled by rememberSaveable { mutableStateOf(false) }
if (!initialApiCalled) {
LaunchedEffect(Unit) {
// do API call
initialApiCalled = false
}
}
此方案的缺点是如果在 API 调用完成之前配置更改,LaunchedEffect
协程将被取消,您的 API 调用也将被取消。最干净的解决方案是使用 View 模型,并在
init
中执行 API 调用。 :class ScreenViewModel: ViewModel() {
init {
viewModelScope.launch {
// do API call
}
}
}
@Composable
fun Screen(viewModel: ScreenViewModel = viewModel()) {
}
official documentation 建议将这样的 View 模型作为参数传递.在产品代码中,您不需要将任何参数传递给此 View ,只需将其称为 Screen()
: 默认创建 View 模型 viewModel()
范围。它被移至测试/预览功能的参数,如 this answer 所示。 .
关于android - 防止 LaunchedEffect 在配置更改时重新运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69629427/