android - 防止 LaunchedEffect 在配置更改时重新运行

标签 android kotlin android-jetpack-compose android-jetpack

我只想在可组合加载时运行一次代码。所以我使用 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/

相关文章:

java - 如何在没有第三库的情况下向 Recyclerview 添加快速滚动滚动条

android - 在 Kotlin 中检查两个对象的某些(不是全部)属性是否相等的惯用方法

android - kotlin 中的 isEmpty 和 isBlank 有什么区别

android - 更新到 1.3.0-alpha02 时找不到 androidx.compose.compiler :compiler:1. 3.0-alpha02

android - 如何根据另一个项目调整撰写列中项目的大小

java - 如何从 fragment 中的 MainActivity 工具栏隐藏项目

java - Kotlin - 未找到文件异常 : File does exist though

android - 将子元素的高度设置为等于 Row 包含的最高其他元素

android - Firebase 无法检索类的值

android - Kotlin 中 Android-Facebook 应用程序的 key 哈希以编程方式