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

如何在Row组件中显示Badge且避免元素重叠

问题原因

Row 中每个 Expanded 子项按顺序渲染,后面的子项会绘制在前面的子项上方,导致前面子项的 Badge 溢出部分被后面的子项覆盖。

解决方法

方法一:通过 Transform 提升层级

给每个包含 Badge 的子项添加 Transform 组件,通过设置 z 轴平移值,让前面的子项层级高于后面的子项,确保 Badge 显示在最上层。

Row(
  children: List.generate(
    7,
    (index) => Expanded(
      child: Transform(
        // 索引越小z值越高,保证前面的Badge不会被后面的元素覆盖
        transform: Matrix4.translationValues(0, 0, 7 - index.toDouble()),
        child: Padding(
          padding: const EdgeInsets.all(2),
          child: Badge(
            badgeContent: const Text('a'),
            child: Container(
              color: Color((Random().nextDouble() * 0xFFFFFF).toInt()).withOpacity(1.0),
            ),
          ),
        ),
      ),
    ),
  ),
)

方法二:用 Stack 分层渲染

将原 Row 作为底层,在 Stack 上层单独绘制所有 Badge,这样 Badge 会处于所有子项的最上层。

Stack(
  children: [
    Row(
      children: List.generate(
        7,
        (index) => Expanded(
          child: Padding(
            padding: const EdgeInsets.all(2),
            child: Container(
              color: Color((Random().nextDouble() * 0xFFFFFF).toInt()).withOpacity(1.0),
            ),
          ),
        ),
      ),
    ),
    ...List.generate(7, (index) {
      final screenWidth = MediaQuery.of(context).size.width;
      final itemWidth = screenWidth / 7;
      // 根据子项宽度计算Badge位置,可根据需求调整数值
      final badgeLeft = itemWidth * index + itemWidth - 12;
      return Positioned(
        left: badgeLeft,
        top: -2,
        child: const Badge(
          badgeContent: Text('a'),
        ),
      );
    }),
  ],
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 19:55:21