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

Flutter开发:如何使容器与ExpansionTile中卡片高度匹配

实现Stack中红色Container高度匹配ExpansionTile容器的方案

要让Stack布局里的红色Container高度和左侧包含ExpansionTile及卡片的容器高度完全匹配,可以通过GlobalKey获取内容容器的实时高度来实现,具体步骤如下:

1. 定义GlobalKey

在你的State类中添加一个GlobalKey,用来绑定左侧的内容容器:

final GlobalKey _contentKey = GlobalKey();

2. 绑定内容容器

将左侧的Padding组件与这个GlobalKey关联:

Padding(
  key: _contentKey, // 绑定key
  padding: const EdgeInsets.only(right: 20, left: 30),
  child: Column(
    children: [
      // 原有姓名、等级等组件...
      const SizedBox(height: 15),
      // 修正原代码语法错误,补全闭合括号
      ExpansionTile(
        title: const Text('Phone'),
        children: List.generate(state.user.boss.length, (index) {
          return const Card(
            child: Text('+91 84785783458'),
          );
        }),
      ),
    ],
  ),
)

3. 同步红色Container高度

修改红色Container的height属性,通过GlobalKey获取内容容器的实时高度:

Container(
  color: Colors.red,
  width: 20,
  // 获取内容容器的高度,默认值设为0避免布局错误
  height: _contentKey.currentContext?.size?.height ?? 0,
  child: const Text('data'),
)

原理说明

当ExpansionTile展开或收起时,内容容器的高度会发生变化,Flutter会触发重新build,此时GlobalKey会获取到最新的容器高度,红色Container的高度也会自动同步更新,实现两者高度完全匹配的效果。

完整代码示例

// 假设在State类中
final GlobalKey _contentKey = GlobalKey();

@override
Widget build(BuildContext context) {
  return Container(
    child: Stack(
      children: [
        Padding(
          key: _contentKey,
          padding: const EdgeInsets.only(right: 20, left: 30),
          child: Column(
            children: [
              Row(
                children: [
                  const Flexible(
                    child: Text('Jhon Doe'),
                  ),
                  Flexible(
                    child: Container(
                      height: 22,
                      width: 70,
                      decoration: BoxDecoration(
                        borderRadius: BorderRadius.circular(4),
                        color: const Color(0XFF00B383),
                      ),
                      child: const Center(
                        child: Padding(
                          padding: EdgeInsets.only(bottom: 1),
                          child: Text('User'),
                        ),
                      ),
                    ),
                  )
                ],
              ),
              const Text('Level'),
              const Row(
                children: [
                  Icon(
                    Icons.level,
                    size: 18,
                    color: Color(0XFF3F414E),
                  ),
                  SizedBox(width: 5),
                  Text('Boss'),
                ],
              ),
              InkWell(
                onTap: () {},
                child: const Text('Detailed'),
              ),
              const SizedBox(height: 15),
              ExpansionTile(
                title: const Text('Phone'),
                children: List.generate(state.user.boss.length, (index) {
                  return const Card(
                    child: Text('+91 84785783458'),
                  );
                }),
              ),
            ],
          ),
        ),
        Container(
          color: Colors.red,
          width: 20,
          height: _contentKey.currentContext?.size?.height ?? 0,
          child: const Text('data'),
        )
      ],
    ),
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:31:04