当前位置: 首页 > 面试题库 >

颤动换行而不是溢出文本

何禄
2023-03-14
问题内容

在Flutter中创建带有长字符串的Text小部件时,将其文本直接放在Column中会自动换行。但是,当它在Column-Row-Column内时,文本会溢出屏幕的一侧。

如何在Column-Row-Column内换行?造成这种差异的原因是什么?在我看来,上列的任何子级都具有相同的宽度是合乎逻辑的吗?为什么宽度无界?

我尝试根据其他答案将文本放在Expanded,Flexible,Container和FittedBox中,但这会导致新的错误,我无法理解。

例:

MaterialApp(
  title: 'Text overflow',
  home: Scaffold(
    appBar: AppBar(title: Text("MyApp"),),
    body: Column(
      children: <Widget>[
        Row(
          children: <Widget>[
            // The long text inside this column overflows. Remove the row and column above this comment and the text wraps.
            Column(
              children: <Widget>[
                Text("Short text"),
                Text("Very long text. Very long text. Very long text. Very long text. Very long text. Very long text. Very long text. Very long text. Very long text. Very long text. Very long text. Very long text. Very long text. Very long text. Very long text. Very long text. Very long text. ")
              ],
            ),
          ],
        ),
      ],
    ),
  ), 
)

问题答案:

Row并且Column是Flex小部件,并且不会滚动,如果没有足够的空间,则抖动会引发溢出错误。

如果发生这种情况,可以使用Expanded或Flexible小部件来包装长文本。

在文档中并没有明确说明,而是扩展以填充主轴上的可用空间,Expanded并Flexible沿横轴方向包装。

The long story

循序渐进的方法可能有助于理解问题。

首先,请考虑以下情形:

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Text overflow',
      home: Scaffold(
        appBar: AppBar(
          title: Text("MyApp"),
        ),
        body: Column(
          children: List.generate(100, (idx) => Text("Short text"))
        ),
      ),
    );
  }
}

这是一个列窗口小部件,它在垂直方向上溢出,由flutter 清楚地报告:

I/flutter ( 8390): The following message was thrown during layout:
I/flutter ( 8390): A RenderFlex overflowed by 997 pixels on the bottom.
I/flutter ( 8390): 
I/flutter ( 8390): The overflowing RenderFlex has an orientation of Axis.vertical.

现在,在列中一行:

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Text overflow',
      home: Scaffold(
        appBar: AppBar(title: Text("MyApp"),),
        body: Column(
          children: <Widget>[
            Row(
              children: <Widget>[
                Text(String.fromCharCodes(List.generate(100, (i) => 65)))
              ],
            ),
          ],
        ),
      ),
    );
  }
}

现在,溢出问题出现在右侧。

我已经在列中插入了一行,只是为了类似于您的情况,但是
如果您使用简单的Row小部件Row,Column则会出现完全相同的问题:并且
这两个Flex小部件都是:

  • 他们将孩子安排在一个方向上;
  • 它们不滚动,因此,如果子级占用的空间超出可用空间,则会引发溢出错误;

扩展小部件
考虑这种布局,一行两行,stiched togheter

Column(
  children: <Widget>[
    Row(
      children: <Widget>[Text('AAAA'), Text('ZZZZ')],
    ),
  ],
),

现在,第一个项目 Expanded 将填满所有可用空间:

Column(
  children: <Widget>[
    Row(
      children: <Widget>[
        Expanded(child: Text('AAAA')),
        Text('ZZZZ')],
    ),
  ],
),

最后,当您展开一个很长的字符串时,您会注意到文本在横轴方向上环绕:

Column(
  children: <Widget>[
    Row(
      children: <Widget>[
        Expanded(child: Text(String.fromCharCodes(List.generate(100, (i) => 65)))),
        Text('ZZZZ')],
    ),
  ],
),


 类似资料:
  • 问题内容: 我有一个div ,其中在用户键入时显示电话号码。div内的文本将向右对齐,并且随着文本向左增加,传入的字符会添加到右侧。 但是,一旦文本大到无法放入div时,数字的最后一个字符就会自动被裁剪,用户将看不到她键入的新字符。 我想做的是裁剪左边的字符,就像div显示的是最右边的内容并溢出到左侧。如何产生这种效果? 问题答案: 您是否尝试过使用以下内容:

  • 问题内容: 我敢肯定这已经被问过了,但是我找不到答案。 我有一个从数据库中提取然后呈现到内容的AngularJS脚本。一切工作正常,除了我试图将一些单词用它们之间的新行连接起来的几个地方。 如果我使用上述代码的第一行,则看不到任何内容,但重新标记的html中没有新行。如果使用第二行,则将其渲染为文本,并且输出如下所示: 代替 如果有帮助,我可以发布完整的脚本,但是我想我只是看不到一些简单的东西。

  • 未定义行为的一个例子是在flow上的整数行为 有没有一个历史的或者(甚至更好!)造成这种差异的技术原因是什么?

  • 问题是当我将页面收缩到某个点时, 元素的顶部溢出,奇怪的是底部没有溢出。说清楚一点,我不想让这两个都溢出来。 这里有一个指向它的JSFiddle链接:https://jsfidle.net/maep468x/1 您将看到,当您运行它并将结果窗口缩小到大约350px时, 元素开始溢出。 我已经尝试从.main-content规则中删除我的line-height和font-size属性,但它仍然溢出。

  • 问题内容: 在基于ReactJS的应用程序中,我执行以下操作: 问题是:“某些文本”包装在DOM中的其他span元素中。有什么办法可以避免这种现象,只输出原始文本? 要明确:我想输出 不 问题答案: 更新: 这在 React v15(2016-04-06)中 已“修复” –现在,注释节点已添加到每段文本周围,但不再包装在标签中。 我们收到了来自社区的一些惊人的贡献在此版本中,我们想强调这种拉请求由

  • 问题内容: 我有一些这样的文字: 我想显示不带标签的内容: 我也不想应用标签,我想剥离它们。有什么简单的方法可以做到这一点? 角HTML: 问题答案: jQuery比SLOWER慢40倍左右 ,请不要将jQuery用于该简单任务。 用法: 使用angular.js: 用 :