AndroidComposeModalBottomSheetLayout导致巨大的重组计数
创始人
2024-10-06 19:30:49
0

可以采用以下代码示例中的方法来避免重组计数过多的问题。

在使用 ModalBottomSheetLayout 时,应该遵循以下几个步骤:

  1. 使用 rememberCoroutineScope 创建 CoroutineScope 对象。
  2. 异步加载 ModalBottomSheetContent,并使用 ModalBottomSheetScaffold 进行包装。
  3. 避免直接在 ModalBottomSheetContent 中使用 compose,而是采用 rememberInfiniteTransition 创建 TransitionScope,使得 transition 在整个生命周期内只被创建一次。

具体的代码实例如下所示:

@OptIn(androidx.compose.runtime.ExperimentalComposeApi::class)
@Composable
fun MyModalBottomSheet() {
    val coroutineScope = rememberCoroutineScope()
    
    // 异步加载 ModalBottomSheetContent
    val modalBottomSheetContent = remember { mutableStateOf<@Composable () -> Unit> { } }
    LaunchedEffect(Unit) {
        modalBottomSheetContent.value = {
            ModalBottomSheetContent {
                Surface(elevation = 8.dp) {
                    Column(Modifier.padding(16.dp)) {
                        Text(text = "Hello World!")
                    }
                }
            }
        }
    }
    
    // 使用 ModalBottomSheetScaffold 包装
    ModalBottomSheetScaffold(
        sheetContent = modalBottomSheetContent.value,
        sheetShape = RoundedCornerShape(topStart = 12.dp, topEnd = 12.dp),
        sheetBehavior = ModalBottomSheetBehavior.Expand,
        sheetBackgroundColor = MaterialTheme.colors.background,
        sheetPeekHeight = 0.dp,
        scaffoldState = rememberModalBottomSheetScaffoldState(),
        coroutineScope = coroutineScope
    ) { 
        // 使用 rememberInfiniteTransition 创建 TransitionScope
        val infiniteTransition = rememberInfiniteTransition()
        val transitionState = infiniteTransition.animateFloat(
            initialValue = 1f,
            targetValue = 0f,
            animationSpec = infiniteRepeatable(
                animation = tween(
                    durationMillis = 1000,
                    easing = LinearEasing
                )
            )
        )

        Column(Modifier.fillMaxSize()) {
            AnimatedLogo(
                transitionState = transitionState,
                modifier = Modifier.weight(1f)
            )
            Button(onClick = {
                coroutineScope.launch {
                    scaffoldState.bottomSheetState.expand()
                }
            }) {
                Text("Show Bottom Sheet")
            }
        }
    }
}

@Composable
fun AnimatedLogo(
    transitionState: Float,
    modifier: Modifier = Modifier
) {
    Box(
        modifier
            .graphicsLayer(
                translationY = (-64).dp * transitionState

相关内容

热门资讯

第一分钟开挂!中至余干有挂吗,... 第一分钟开挂!中至余干有挂吗,新漫游免费辅助器,透视教程-2026最新版本第一分钟开挂!中至余干有挂...
现场直击!决战卡五星有挂吗(辅... 决战卡五星有挂吗 无需打开直接搜索微信:136704302本司针对手游进行,选择我们的四大理由: 1...
第七分钟开挂!欢乐对决破解版免... 第七分钟开挂!欢乐对决破解版免内购,闲聚app辅助软件,科技教程-2026最新版本欢乐对决破解版免内...
受玩家影响!潮汕汇鱼虾蟹辅助(... 受玩家影响!潮汕汇鱼虾蟹辅助(辅助挂)一直确实有挂(有挂教材)-哔哩哔哩《详细加薇136704302...
第8分钟开挂!微乐小程序辅助脚... 第8分钟开挂!微乐小程序辅助脚本平台,九九山城插件程序,第三方教程-2026最新版本所有人都在同一条...
这一问题亟待解决!网易棋牌辅助... 【亲,网易棋牌辅助器 这款游戏可以开挂的,确实是有挂的,很多玩家在这款网易棋牌辅助器中打牌都会发现很...
四分钟开挂!浙江茶园辅助,决战... 四分钟开挂!浙江茶园辅助,决战卡五星辅助,存在挂教程-2026最新版本在进入决战卡五星辅助辅助挂后,...
据相关数据显示!兴动互娱辅助脚... 您好:这款兴动互娱辅助脚本游戏是可以开挂的,确实是有挂的,很多玩家在这款兴动互娱辅助脚本游戏中打牌都...
第五分钟开挂!皇豪互众控制系统... 第五分钟开挂!皇豪互众控制系统下载,微信中至有辅助吗,攻略教程-2026最新版本1、点击下载安装,皇...
现就发布提示!一起宁德游戏万能... 现就发布提示!一起宁德游戏万能辅助器(辅助挂)果然有挂(有挂绝活儿)-哔哩哔哩;无需打开直接搜索打开...