LaunchedEffect 启动次数不止一次

LaunchedEffect starts more that once

提问人:Илья Жиленков 提问时间:10/18/2023 最后编辑:Илья Жиленков 更新时间:10/18/2023 访问量:55

问:

我遇到了问题,问题在于工作不正常。我想在启动一次时,当用户点击对应时,因为应该只向服务器发送一个请求。我添加了不可变参数以使其不可重新启动,但是每次单击导航按钮时,AppInspection 工具都会显示网络正在使用LaunchedEffectblockLaunchedEffectNavigationBarItemblockUnitblock

@Composable
fun PostScreen(postsViewModel: PostsViewModel) {

    val state = postsViewModel.posts.observeAsState()

    LazyColumn(
        modifier = Modifier.fillMaxSize(),
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        state.value?.forEach {
            item { Post(it) }
        } ?: item { CircularProgressIndicator() }
    }

    LaunchedEffect(key1 = Unit, block = {
        postsViewModel.getAllPosts()
    })
}
人造人 科特林 android-jetpack-compose 安卓喷气背包 副作用

评论

0赞 BenjyTec 11/9/2023
您能够解决问题吗?

答:

1赞 BenjyTec 10/18/2023 #1

LaunchedEffect(Unit)当可组合项进入屏幕时,执行一次块。每当您离开并重新选择 BottomNavigation 项时,它都会再次触发。

假设您已经根据文档设置了 NavHost 和 BottomNavigation,解决方案可能非常简单:saveState=truerestoreState=true

@Composable
fun PostScreen(postsViewModel: PostsViewModel) {

    var initialComposition by rememberSaveable{ mutableStateOf(true) }
    val state = postsViewModel.posts.observeAsState()

    LaunchedEffect(Unit) {
        if (initialComposition) {
            postsViewModel.getAllPosts()
            initialComposition = false
        }
    }

    // ...
}

评论

1赞 Thracian 10/18/2023
这可能是问题所在。LaunachedEffect 在引擎盖下被记住。在重构时,也不应记住重新启动LaunchedEffect