66
  Widget build(context) {
    return Row(
      mainAxisSize: MainAxisSize.min,
      children: [
        Container(
          width: 300,
          padding: EdgeInsets.all(10),
          decoration: BoxDecoration(
            color: color ?? Colors.blue,
            borderRadius: BorderRadius.circular(10)
          ),
          child: msg
        )
      ],  
    );
  }

这是我的小部件的构建方法,它根据我作为msg参数传递的内容呈现这个 UI

  1. 加载文本 在此处输入图像描述
  2. 一些很长的文字 在此处输入图像描述

现在我面临的问题是我无法在不设置宽度的情况下将文本包装在这个容器/蓝色框内,但是如果我设置了容器/蓝色框的宽度,那么无论文本有多短,它都会保持那么宽.

现在有没有办法设置容器/蓝色框的 maxWidth(比如 500)?这样蓝色框将变得与“加载”之类的小文本所需的一样宽,对于长文本,它会扩展直到达到 500 个单位的宽度,然后将文本换行?

长文本所需的输出:

对于像加载这样的小文本,我不希望 UI 有任何变化,但对于长文本,我希望它看起来像这样。 在此处输入图像描述

4

10 回答 10

141

您可以使用以下首选向容器小部件添加约束maxWidth

Widget build(context) {
return Row(
  mainAxisSize: MainAxisSize.min,
  children: [
    Container(
      constraints: BoxConstraints(minWidth: 100, maxWidth: 200),
      padding: EdgeInsets.all(10),
      decoration: BoxDecoration(
        color: color ?? Colors.blue,
        borderRadius: BorderRadius.circular(10)
      ),
      child: msg
    )
  ],  
);
}

我希望这有帮助!

于 2019-03-30T12:57:07.310 回答
22

使用ConstrainedBoxwith BoxConstraints maxWidth, 包裹在一个Flexible()小部件中。灵活的小部件还允许框调整大小以适应较小的屏幕。

Flexible(
  child: ConstrainedBox(
    constraints: BoxConstraints(maxWidth: 150),
    child: Container(
      color : Colors.blue,
      child: Text('Your Text here'),
    ),
  ),
),
于 2020-04-13T07:09:32.700 回答
10

这需要在内部RowColumnWidget

1. 行

  Row(
      children: [
        Container(
            constraints: BoxConstraints(maxWidth: 300),
            decoration: BoxDecoration(
                borderRadius: BorderRadius.circular(8.0)),
            child: Text("Long Text....")
        ),
      ],
    );

2.专栏

Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Container(
            constraints: BoxConstraints(maxWidth: 300),
            decoration: BoxDecoration(
                borderRadius: BorderRadius.circular(8.0)),
            child: Text("Long Text....")
        ),
      ],
    );

在这两个示例中,它都在起作用,因为ColumnRow允许它的子级扩展到给定的约束/大小。

注意:如果孩子想要与其父母不同的尺寸,而父母没有足够的信息来对齐它,那么孩子的尺寸可能会被忽略。

于 2020-12-13T08:21:21.963 回答
4

在小部件中使用Constraints属性Container

使用maxWidthminWidth价值来实现需求。

 Container(
      constraints: BoxConstraints(minWidth: 150, maxWidth: 300),
      padding: EdgeInsets.all(10),
      decoration: BoxDecoration(
        borderRadius: BorderRadius.circular(5)),
      child: Text("")
    )
于 2020-12-11T10:02:25.213 回答
4

对我来说,至少将约束框放在 IntrinsicWidth 中已经解决了问题。

IntrinsicWidth(
  child: Container(
    constraints: BoxConstraints(maxWidth: 200),
    child: Row(
      children: [
       
      ],
    ),
  ),
);
于 2021-05-26T11:30:59.800 回答
4

这是我用于长文本的一种简单方法:

ConstrainedBox(
  constraints: BoxConstraints(maxWidth: 200),
  child: Container(
    child: Text(
      'Long string of text',
      maxLines: 2,
      overflow: TextOverflow.ellipsis,
    ),
  ),
)

如果您希望仅显示一行文本,请注意maxLines可能有用的属性。

于 2020-09-29T20:57:21.683 回答
1

这就是我修复它的方法

Center(
    child: Container(
      child: this.child,
      width: 300,
      height: double.infinity,
    ),
  )
于 2021-01-22T11:26:34.480 回答
1

也许在文本周围使用 Flexible 然后将 Flexible 包装在固定大小的容器中?只是一个想法。

于 2019-03-15T15:01:37.047 回答
0

在我的情况下,我的解决方案是:包装在 Row 中并添加 Spacer(在评论气泡小部件中,我没有定义任何最大宽度。它的增长取决于文本。限制宽度添加填充到评论气泡。

return Row(
      children: [
          CommentBubble(
              chatText: snapshot.get('text'),
              sentAt: snapshot.get('sentAt'),
              sendBy: snapshot.get('sendBy'),
          ),
          Spacer(),
      ],
);
于 2021-01-18T23:21:01.257 回答
0

我知道已经晚了,但将来有人可能会得到帮助。
我使用了auto_size_text 插件来完成它:

AutoSizeText(
  'A really long String',
  style: TextStyle(fontSize: 30),
  minFontSize: 18,
  maxLines: 4,
  overflow: TextOverflow.ellipsis,
)
于 2020-05-11T06:23:35.427 回答