You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Jetpack Compose实现类似Flutter的调试横幅?

Jetpack Compose 实现 Flutter 风格调试横幅

下面是贴近Flutter调试横幅效果的实现方案,包含核心功能和细节优化:

核心实现代码

import android.os.Build
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp

@Composable
fun DebugBanner(
    onDismiss: () -> Unit = {}
) {
    // 仅在Debug编译模式下显示
    if (BuildConfig.DEBUG) {
        Box(
            modifier = Modifier
                .fillMaxSize()
                .padding(top = 16.dp, end = 16.dp),
            contentAlignment = Alignment.TopEnd
        ) {
            Surface(
                color = Color(0xFFFFC107), // 匹配Flutter调试横幅的黄色
                elevation = 4.dp,
                modifier = Modifier
                    .rotate(-45f) // 倾斜角度和Flutter保持一致
                    .clickable { onDismiss() }
            ) {
                Text(
                    text = "DEBUG",
                    color = Color.White,
                    fontWeight = FontWeight.Bold,
                    modifier = Modifier.padding(
                        horizontal = 32.dp,
                        vertical = 4.dp
                    )
                )
            }
        }
    }
}

使用方式

在根布局中加入该组件,配合状态控制实现点击隐藏:

import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier

@Composable
fun MainScreen() {
    var showDebugBanner by remember { mutableStateOf(true) }

    Box(modifier = Modifier.fillMaxSize()) {
        // 你的主界面内容
        Text(
            text = "App主内容区域",
            modifier = Modifier.align(Alignment.Center)
        )

        // 显示调试横幅
        if (showDebugBanner) {
            DebugBanner(onDismiss = { showDebugBanner = false })
        }
    }
}

细节优化建议

  • 颜色匹配:若觉得黄色不够精准,可将Color值改为Color(0xFFFFD700)(黄金色),更贴近Flutter原版
  • 动画增强:添加淡出动画让隐藏效果更平滑:
    import androidx.compose.animation.AnimatedVisibility
    import androidx.compose.animation.fadeOut
    
    // 使用时替换为AnimatedVisibility
    AnimatedVisibility(
        visible = showDebugBanner,
        exit = fadeOut()
    ) {
        DebugBanner(onDismiss = { showDebugBanner = false })
    }
    
  • 全局复用:可将该组件封装到App主题的根布局中,无需在每个页面单独添加

内容的提问来源于stack exchange,提问作者Emmanuel Mtali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 14:50:07