【问题标题】:How to wrap a row of texts?如何换行一行文本?
【发布时间】:2019-10-11 12:33:46
【问题描述】:

我在一个 Row 中有两个 Text 小部件。我想一个接一个地显示文本小部件,如果它不适合第一行,则将第二个小部件换行到下一行。

我尝试过 Flexible、Wrap 等等。我似乎无法让它工作。

Row(
    children: <Widget>[
        Text('This is some text.'),
        Text('Another piece of text.')
    ]
);

我希望输出看起来像这样(屏幕边缘由 | 表示):

|This is some text. Another |
|piece of text.             |

我能得到的最好的结果如下:

|This is some  Another piece|
|text.         of text.     |

编辑:谢谢大家的回复。我也尝试过 RichText,它可以工作,但我想将多个手势绑定到每个 TextSpan 元素,而使用 RichText 无法轻松做到这一点。我即将为此创建一个问题,但 stackoverflow 不允许我在 90 分钟内创建一个以上的问题。

【问题讨论】:

  • 添加这个:mainAxisAlignment: MainAxisAlignment.spaceBetween
  • @MaadhavSharma,那没用。如果它对你有用,你能分享你的代码吗?
  • 请发布您的代码,您是如何实现的。
  • @MaadhavSharma,我在上面添加了mainAxisAlignment: MainAxisAlignment.spaceBetween 作为Row 的第一个参数。

标签: flutter


【解决方案1】:

更新答案

您做错的第一件事是使用 Row 将一个文本小部件放在另一个文本下。

|This is some text. Another | |piece of text. |

这是您想要实现的用户界面,对吗?所以从你的问题来看,很明显你想要两个文本小部件一个在另一个之下。

所以这段代码对你有用。像这样用Column 小部件替换Row。如果您想继续使用 Row,您的每个文本都会换行,但不会一个接一个地换行。这是工作代码。我已经放了两个文本来向您展示它们是如何一个接一个地包装的。查看下图查看结果

body: Center(
    child: Container(
      color: Colors.amberAccent,
      width: 200,
      height: 200,
      child: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          children: <Widget>[
            Flexible(
              fit: FlexFit.tight,
              child: Text(
                'This is some text.long text more long Text, even more long text',
                style: TextStyle(color: Colors.white, fontSize: 20.0),
              ),
            ),
            Flexible(
              fit: FlexFit.tight,
              child: Text(
                'Another piece of text.not so long text yet needs to be a liitle long text',
                style: TextStyle(color: Colors.white, fontSize: 20.0),
              ),
            )
          ],
        ),
      ),
    ),
  ),

这里是截图

【讨论】:

  • 谢谢,但您的建议无效。我得到两行文字。我想继续第一行,如果它不适合屏幕,则仅将文本换行到下一行。在您的屏幕截图中,我希望“A”出现在同一行的“Fruid Salad”之后。下一行应该继续“刷新...”。
  • @PuchkaIndur,感谢您的更新,但这不是我想要的。看看我原来的问题中的“另一个”如何与第一个文本在同一行。在您的示例中,两个文本都在不同的行上。
【解决方案2】:

请尝试以下代码:-

Expanded(
          child: Wrap(
            direction: Axis.horizontal,
            runAlignment: WrapAlignment.start,
            children: <Widget>[
              Text('This is some text.'),
              Text('Another piece of text.')
            ],
          ),
          flex: 1,
        ),

【讨论】:

  • 我收到以下错误:“ParentDataWidget 使用不正确。扩展的小部件必须放在 Flex 小部件内...”。你能完整分享你的代码吗?
【解决方案3】:

您可以使用 RichText 小部件来实现:

@override
Widget build(BuildContext context) {
  return Scaffold(
    backgroundColor: Colors.grey,
    appBar: AppBar(),
    body: RichText(
      text: TextSpan(
        children: [
          TextSpan(text: "This is some text."),
          TextSpan(text: "Another piece of text. Another piece of text. Another piece of text. Another piece of text."),
        ],
      ),
    ),
  );
}

RichText 小部件显示使用多种不同样式的文本。 使用 TextSpan 对象树描述要显示的文本, 每个都有一个用于该子树的关联样式。 文本可能跨越多行或可能全部显示 根据布局约束在同一行。

RichText

【讨论】:

  • 谢谢。我忘了提到我尝试使用 RichText,虽然它有效,但我不能将多个手势绑定到 TextSpan,它只接受一个手势识别器。如何使用文本小部件实现上述目标?
  • 您可以添加任何一种类型识别器的手势,例如您可以将来自 TapGestureRecognizer 的 onTapUp、onTapDown 和 onTapCancel 添加到 TextSpan,或者您可以添加 onDown、onStart、onEnd、onUpdate 和 onCancel来自 DragGestureRecognizer,但是如果你想将 onTapUp 和 onStart 添加到同一个 TextSpan,我认为这是不可能的,这是你想要的吗?
  • 是的,我要加onTap和onLongPress,好像不可能?
  • 似乎不可能,为此发布一个特定问题会很有趣。但是我有一个针对您的情况的解决方法,您可以使用 onTapDown 和 onTapUp 使用 Timer 模拟长按
猜你喜欢
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多