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

Flutter:如何使两个Text Widget尺寸一致(文本、字号不同且FittedBox无效)

让两个Text组件保持相同尺寸的几种可行方案

方案一:利用IntrinsicWidth + IntrinsicHeight(无状态实现,简单快捷)

这种方法会让两个Text自动取彼此之间最大的宽高作为共同尺寸,无需额外状态管理,适合大多数场景:

Row(
  mainAxisAlignment: MainAxisAlignment.center,
  children: [
    IntrinsicWidth(
      child: IntrinsicHeight(
        child: Column(
          children: [
            // 第一个Text,内容短、字号小
            Container(
              alignment: Alignment.center,
              color: Colors.grey[200],
              child: Text("Hi", style: TextStyle(fontSize: 16)),
            ),
            SizedBox(height: 8),
            // 第二个Text,内容长、字号大
            Container(
              alignment: Alignment.center,
              color: Colors.grey[200],
              child: Text("Hello World!", style: TextStyle(fontSize: 24)),
            ),
          ],
        ),
      ),
    ),
  ],
)

如果是横向排列两个Text,把Column换成Row即可。IntrinsicWidth会强制所有子组件宽度一致(取最大宽度),IntrinsicHeight则处理高度,配合Container的alignment可以让文本在固定尺寸内居中显示。

方案二:手动测量尺寸并复用(精确控制,适合复杂场景)

如果需要更精准的控制(比如固定以某一个Text的尺寸为准,而非取最大值),可以用TextPainter测量目标Text的尺寸,再用SizedBox把尺寸套给另一个Text:

class EqualSizeTextPair extends StatefulWidget {
  final String fixedText;
  final TextStyle fixedStyle;
  final String targetText;
  final TextStyle targetStyle;

  const EqualSizeTextPair({
    super.key,
    required this.fixedText,
    required this.fixedStyle,
    required this.targetText,
    required this.targetStyle,
  });

  @override
  State<EqualSizeTextPair> createState() => _EqualSizeTextPairState();
}

class _EqualSizeTextPairState extends State<EqualSizeTextPair> {
  Size? _fixedTextSize;

  @override
  Widget build(BuildContext context) {
    return Row(
      children: [
        // 先测量基准Text的尺寸
        LayoutBuilder(
          builder: (context, constraints) {
            if (_fixedTextSize == null) {
              final painter = TextPainter(
                text: TextSpan(text: widget.fixedText, style: widget.fixedStyle),
                textDirection: TextDirection.ltr,
                maxLines: 1, // 根据需求调整行数
              )..layout(maxWidth: constraints.maxWidth);
              setState(() => _fixedTextSize = painter.size);
            }
            return SizedBox.fromSize(
              size: _fixedTextSize,
              child: Text(widget.fixedText, style: widget.fixedStyle),
            );
          },
        ),
        SizedBox(width: 16),
        // 复用基准尺寸给目标Text
        if (_fixedTextSize != null)
          SizedBox.fromSize(
            size: _fixedTextSize,
            child: Text(
              widget.targetText,
              style: widget.targetStyle,
              overflow: TextOverflow.ellipsis, // 内容超出时的处理方式
              textAlign: TextAlign.center,
            ),
          ),
      ],
    );
  }
}

使用时直接传入两个文本和对应的样式即可,这种方式可以指定以其中一个Text的尺寸为标准,适合需要严格对齐的场景。

为什么FittedBox没达到效果?

FittedBox的作用是缩放文本以适应父容器的尺寸,而不是让两个文本的容器尺寸一致。如果之前用FittedBox时没给父容器固定尺寸,它只会根据文本自身大小缩放,自然无法让两个Text保持同尺寸。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 13:30:21