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

Flutter技术问询:如何减小ExpansionTile组件的默认高度

如何减小Flutter中ExpansionTile的默认高度

我在Flutter应用中使用了ExpansionTile组件,想要减小它的默认高度。尝试了多种现有解决方案(比如设置ListTileTheme的dense属性等),但都没达到预期效果。

当前代码片段

child: Padding(
  padding: const EdgeInsets.symmetric(horizontal: 18.0),
  child: ListTileTheme(
    dense: true,
    horizontalTitleGap: 0.0,
    minLeadingWidth: 0,
    contentPadding: EdgeInsets.zero,
    child: ExpansionTile(
      title: AppText(
        "+ More",
        textStyle: textStyle,
        textAlign: TextAlign.center,
      ),
      backgroundColor: AppColors.whiteColor,
      collapsedBackgroundColor: AppColors.whiteColor,
      shape: const RoundedRectangleBorder(
        borderRadius: BorderRadius.zero,
      ),
      trailing: const SizedBox(height: 0),
      children: const <Widget>[
        ListTile(title: Text('This is tile number 1')),
      ],
    ),
  ),
),

当前效果

ExpansionTile当前高度效果


解决方案

方案1:调整ListTileTheme的minTileHeight并压缩title内边距

ExpansionTile的默认高度由内部ListTile的minTileHeight控制,仅设置dense: true无法完全压缩,需要显式设置更小的minTileHeight,同时给title组件添加紧凑内边距:

child: Padding(
  padding: const EdgeInsets.symmetric(horizontal: 18.0),
  child: ListTileTheme(
    dense: true,
    horizontalTitleGap: 0.0,
    minLeadingWidth: 0,
    contentPadding: EdgeInsets.zero,
    // 直接设置最小高度,按需调整数值
    minTileHeight: 30, 
    child: ExpansionTile(
      title: Padding(
        // 压缩title的上下内边距,进一步缩小高度
        padding: const EdgeInsets.symmetric(vertical: 2),
        child: AppText(
          "+ More",
          textStyle: textStyle,
          textAlign: TextAlign.center,
        ),
      ),
      backgroundColor: AppColors.whiteColor,
      collapsedBackgroundColor: AppColors.whiteColor,
      shape: const RoundedRectangleBorder(
        borderRadius: BorderRadius.zero,
      ),
      // 替换为更小的展开图标,避免占用额外高度
      trailing: const Icon(Icons.expand_more, size: 16),
      children: const <Widget>[
        ListTile(title: Text('This is tile number 1')),
      ],
    ),
  ),
),

方案2:全局覆盖ExpansionTile样式(Theme方式)

如果需要在多个地方统一调整ExpansionTile高度,可以用Theme组件包裹,修改全局ListTile样式:

Theme(
  data: Theme.of(context).copyWith(
    listTileTheme: const ListTileThemeData(
      minTileHeight: 30,
      dense: true,
      contentPadding: EdgeInsets.zero,
    ),
  ),
  child: ExpansionTile(
    // 你的ExpansionTile配置
  ),
)

关键说明

  • minTileHeight:这是控制ExpansionTile触发区域高度的核心属性,直接设置为你需要的最小高度(比如28、30)。
  • Title内边距:默认文本组件可能自带行高或内边距,手动设置更小的vertical padding可以进一步压缩整体高度。
  • Trailing组件:默认展开图标有固定大小,替换为更小的Icon或空容器,避免占用不必要的垂直空间。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 03:07:53