【问题标题】:How to design a Text Widget that wraps automatically in flutter?如何设计一个在颤动中自动换行的文本小部件?
【发布时间】:2020-02-06 11:04:19
【问题描述】:

我想设计一个自动换行的文本小部件,当文本长度超过最大值时它使用省略号。

下面的代码可以达到类似的效果。

Container(
  color: Colors.red,
  child: Text(
    'DENTIFICATIONDENTIFICATIONDENTIFICATIONDENTIFICATIONDENTIFICATIONDENTIFICATIONDENTIFICATIONDENTIFICATIONDENTIFICATIONDENTIFICATIONDENTIFICATIONDENTIFICATIONDENTIFICATIONDENTIFICATIONDENTIFICATIONDENTIFICATIONDENTIFICATIONDENTIFICATIONDENTIFICATIONDENTIFICATION',
    overflow: TextOverflow.ellipsis,
    maxLines: 6,
  ),
),

但它必须指定maxLines,我不想要这个,我需要小部件根据父级的大小自动设置maxLines

如何改进代码?

【问题讨论】:

    标签: flutter dart flutter-layout


    【解决方案1】:

    只需从您的代码中删除maxLines,您的父窗口小部件就会相应地处理它,假设传递给Text 的约束是有界的,例如在本例中,我使用SizedBoxheight: 100,并且输出正是你想要的:

    编辑:

    SizedBox(
      height: 100,
      child: Text(
        'DENTIFICATIOND...DENTIFICATIOND...DENTIFICATIOND...DENTIFICATIOND...DENTIFICATIOND...DENTIFICATIOND...DENTIFICATIOND...DENTIFICATIOND...DENTIFICATIOND...DENTIFICATIOND...',
        overflow: TextOverflow.ellipsis,
        maxLines: 1000, // you can freely use any value here
      ),
    )
    

    输出:

    【讨论】:

    • 我需要文本自动换行,而不是手动指定\n
    • 我使用 \n 只是为了向您展示如果您的文本超过您选择的 6 行会是什么样子。
    • 如果不使用\n,则文字只会显示为一行。
    • 好的,知道了,谢谢,请查看更新后的代码。
    • 感谢您的帮助,但仍然不是我想要的,可能是我没有说清楚。省略号是由文本自动生成的,而不是手动生成的。当文本超过父控件的最大高度时,使用省略号代替多余的文本
    【解决方案2】:

    文本换行存在一些已知问题,特别是省略号(如果您未指定 maxLines):Flexible text overflow ellipsis (softWrap false)

    但是,您可以执行以下操作来根据父小部件确定 maxLines:

    SizedBox(
      height: 40.0,
      child: LayoutBuilder(
        builder: (BuildContext context, BoxConstraints constraints) {
          double fontSize = 16.0;
          return Text(
            "DENTIFICATIONDDENTIFICATIONDDENTIFICATIONDDENTIFICATIONDDENTIFICATIONDDENTIFICATIONDDENTIFICATIONDDENTIFICATIONDDENTIFICATIONDDENTIFICATIONDDENTIFICATIONDDENTIFICATIONDDENTIFICATIONDDENTIFICATIONDDENTIFICATIOND",
            style: TextStyle(fontSize: fontSize, height: 1.0),
            maxLines: constraints.maxHeight ~/ fontSize,
            overflow: TextOverflow.ellipsis,
          );
        },
      )
    

    如果你知道父母的身高,你可以这样做:

    double fontSize = 16.0;
    double height = 40.0;
    
    SizedBox(
      height: height,
      child: Text(
        "DENTIFICATIONDDENTIFICATIONDDENTIFICATIONDDENTIFICATIONDDENTIFICATIONDDENTIFICATIONDDENTIFICATIONDDENTIFICATIONDDENTIFICATIONDDENTIFICATIONDDENTIFICATIONDDENTIFICATIONDDENTIFICATIONDDENTIFICATIONDDENTIFICATIOND",
        style: TextStyle(fontSize: fontSize, height: 1.0),
        maxLines: parentHeight ~/ fontSize,
        overflow: TextOverflow.ellipsis,
      )
    

    【讨论】:

      【解决方案3】:

      你可以试试这个方法:

      @override
      Widget build(BuildContext context) {
        String longText = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum";
        double size = 100, fontSize = 16; 
      
        return Scaffold(
          appBar: AppBar(),
          body: Padding(
            padding: const EdgeInsets.all(20.0),
            child: SizedBox(
              height: size,
              child: Text(
                longText,
                style: TextStyle(fontSize: fontSize, height: 1),
                overflow: TextOverflow.ellipsis,
                maxLines: size ~/ fontSize,
              ),
            ),
          ),
        );
      }
      

      输出:

      【讨论】:

      • 但是我不知道父widget的高度,它会根据屏幕变化。有没有办法动态获取呢?
      • 这就是为什么我问你谁是你的 Text 的父母,是的,你可以使用 LayoutBuilder 动态更改它
      猜你喜欢
      • 2020-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      • 2018-02-23
      • 1970-01-01
      • 2020-08-03
      相关资源
      最近更新 更多