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

Flutter GridView内设置maxLines的中文文本第二行显示不全怎么办

Flutter 水平GridView内Text组件第二行显示不全问题

问题表现

水平滚动GridView内,设置maxLines: 2、overflow: TextOverflow.ellipsis的Text组件第二行文本底部被截断,无法完整展示,效果见截图:
Text第二行截断效果截图

复现代码

Widget testText() {
  return GridView.builder(
    scrollDirection: Axis.horizontal,
    gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
    itemCount: 8,
    itemBuilder: (BuildContext context, int index) {
      return Text(
        '测试两行测试两行测测试两行试两行测测试两行试两',
        maxLines: 2,
        overflow: TextOverflow.ellipsis,
        style: TextStyle(fontSize: 20),
      );
    },
  );
}

问题原因

SliverGridDelegateWithFixedCrossAxisCount默认的子组件宽高比childAspectRatio为1.0,即网格子项为正方形。20号字号的中文文本搭配默认行高,两行内容的实际排版高度略高于正方形单元格分配的可用高度,叠加中文字符渲染自带的底部排版边距,最终导致第二行文字底部被网格裁切。

解决方案

可根据业务场景任选以下一种方案修复:

  • 调整网格代理的宽高比参数,给纵向预留足够文本显示的高度
    调小childAspectRatio的值(数值越小,子项高度越高),直到文本完整显示即可,示例修改:
    gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
      crossAxisCount: 2,
      childAspectRatio: 0.8, // 可根据实际字号、布局需求微调该值
    ),
    
  • 给Text设置固定行高的StrutStyle,锁定文本排版高度,避免字体默认边距导致的高度溢出
    Text(
      '测试两行测试两行测测试两行试两行测测试两行试两',
      maxLines: 2,
      overflow: TextOverflow.ellipsis,
      style: TextStyle(fontSize: 20),
      strutStyle: StrutStyle(
        fontSize: 20,
        height: 1.2, // 行高倍数,可按需调整
        forceStrutHeight: true,
      ),
    )
    
  • 给Text添加上下内边距,避免文本贴住单元格边缘被裁切
    Padding(
      padding: EdgeInsets.symmetric(vertical: 2),
      child: Text(
        '测试两行测试两行测测试两行试两行测测试两行试两',
        maxLines: 2,
        overflow: TextOverflow.ellipsis,
        style: TextStyle(fontSize: 20),
      ),
    )
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 04:21:41