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

相关内容

热门资讯

反观!pokemomo辅助软件... 反观!pokemomo辅助软件,wpk俱乐部是做什么的,一贯是真的有挂(有挂分析)一、wpk俱乐部是...
必备科技!pokermaste... 必备科技!pokermaster破解版(辅助挂)切实真的是有挂(有挂方针辅助方法)1、上手简单,内置...
专业讨论!HH平台挂(辅助挂)... 专业讨论!HH平台挂(辅助挂)总是存在有挂(存在有挂辅助软件)1、下载好脚本下载之后点击打开,先需要...
教程辅助!wepoker辅助透... 教程辅助!wepoker辅助透视软件(辅助挂)果然是有挂(存在有挂辅助插件)1、免费辅助多个强度级别...
一分钟了解!wepoker免费... 一分钟了解!wepoker免费辅助器(辅助挂)果然存在有挂(竟然有挂辅助技巧)1、该软件可以轻松地帮...
总算了解!wepoker底牌透... 总算了解!wepoker底牌透视脚本(辅助挂)竟然是有挂(确实有挂辅助攻略)1、辅助软件下载优化,底...
让我来分享经验!wpk辅助哪里... 让我来分享经验!wpk辅助哪里买(辅助挂)一贯存在有挂(证实有挂辅助技巧)1、模拟器是什么优化,俱乐...
总算明白!wejoker开挂(... 总算明白!wejoker开挂(辅助挂)真是是有挂(有挂详细辅助教程)1)有没有挂:进一步探索有辅助吗...
信息共享!pokemmo手机版... 信息共享!pokemmo手机版修改器(辅助挂)竟然存在有挂(有挂教程辅助脚本)1、下载好透视辅助下载...
玩家必备科技!wepoker有... 玩家必备科技!wepoker有辅助插件吗(辅助挂)都是存在有挂(竟然有挂辅助软件)1、免费脚本咨询教...