Flutter - quebra o texto no estouro, como inserir reticências ou esmaecer


121

Estou tentando criar uma linha em que o texto central tenha um tamanho máximo e, se o conteúdo do texto for muito grande, ele se ajusta ao tamanho.

Insiro a TextOverflow.ellipsispropriedade para encurtar o texto e inserir os pontos triplos, ...mas não está funcionando.

main.dart

import 'package:flutter/material.dart';

void main() {
runApp(new MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new HomePage(),
    );
  }
}

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) => new Scaffold(
    appBar: new AppBar(
      backgroundColor: new Color(0xFF26C6DA),
    ),
    body: new ListView  (
      children: <Widget>[
        new Card(
          child: new Container(
            padding: new EdgeInsets.symmetric(horizontal: 16.0, vertical: 18.0),
            child: new Row(
              children: <Widget>[
                new Container(
                  padding: new EdgeInsets.only(right: 24.0),
                  child: new CircleAvatar(
                    backgroundColor: new Color(0xFFF5F5F5),
                    radius: 16.0,
                  )
                ),
                new Container(
                  padding: new EdgeInsets.only(right: 13.0),
                  child: new Text(
                    'Text lar...',
                    overflow: TextOverflow.ellipsis,
                    style: new TextStyle(
                      fontSize: 13.0,
                      fontFamily: 'Roboto',
                      color: new Color(0xFF212121),
                      fontWeight: FontWeight.bold,
                    ),
                  ),
                ),
                new Container(
                  child: new Column(
                    crossAxisAlignment: CrossAxisAlignment.end,
                    children: <Widget>[
                      new Row(
                        children: <Widget>[
                          new Text(
                            'Bill  ',
                            style: new TextStyle(
                              fontSize: 12.0,
                              fontFamily: 'Roboto',
                              color: new Color(0xFF9E9E9E)
                            ),
                          ),
                          new Text(
                            '\$ -999.999.999,95',
                            style: new TextStyle(
                              fontSize: 14.0,
                              fontFamily: 'Roboto',
                              color: new Color(0xFF212121)
                            ),
                          ),
                        ],
                      ),
                      new Row(
                        children: <Widget>[
                          new Text(
                            'Limit  ',
                            style: new TextStyle(
                              fontSize: 12.0,
                              fontFamily: 'Roboto',
                              color: new Color(0xFF9E9E9E)
                            ),
                          ),
                          new Text(
                            'R\$ 900.000.000,95',
                            style: new TextStyle(
                              fontSize: 14.0,
                              fontFamily: 'Roboto',
                              color: new Color(0xFF9E9E9E)
                            ),
                          ),
                        ],
                      ),
                    ]
                  )
                )
              ],
            ),
          )
        ),
      ]
    )
  );
}

resultado:

insira a descrição da imagem aqui

esperado:

insira a descrição da imagem aqui

Respostas:


246

Você deve envolver seu Containerem um Flexiblepara deixar seuRow saiba que não há problema Containerem ser mais estreito do que sua largura intrínseca. Expandedtambém funcionará.

captura de tela

Flexible(
  child: new Container(
    padding: new EdgeInsets.only(right: 13.0),
    child: new Text(
      'Text largeeeeeeeeeeeeeeeeeeeeeee',
      overflow: TextOverflow.ellipsis,
      style: new TextStyle(
        fontSize: 13.0,
        fontFamily: 'Roboto',
        color: new Color(0xFF212121),
        fontWeight: FontWeight.bold,
      ),
    ),
  ),
),

1
Eu tenho um problema semelhante na coluna. Essa abordagem não está funcionando para mim. stackoverflow.com/questions/52206221/…
Michael Tedla

existe alguma maneira de implementar isso no campo de texto?
mangkool

se você quer que ele também tem o texto wrap_content especificar a propriedade ajuste com FlexFit.loose,
martinseal1987

108

Usando reticências

Text(
  "This is a long text",
  overflow: TextOverflow.ellipsis,
),

insira a descrição da imagem aqui


Usando Fade

Text(
  "This is a long text",
  overflow: TextOverflow.fade,
  maxLines: 1,
  softWrap: false,
),

insira a descrição da imagem aqui


Usando Clip

Text(
  "This is a long text",
  overflow: TextOverflow.clip,
  maxLines: 1,
  softWrap: false,
),

insira a descrição da imagem aqui


Nota:

Se você estiver usando Textdentro de um Row, pode colocar acima Textdentro Expandedcomo:

Expanded(
  child: AboveText(),
)

posso adicionar quando o texto estoura e, em seguida, adicionar um botão plano como ... mais link
mr.hir

@ mr.hir, desculpe, não entendi.
CopsOnRoad

Isso não funciona se você tiver texto e outro widget (por exemplo, ícone) centralizado dentro de uma linha.
Lukasz Ciastko

softWrap: falseé exatamente o que eu precisava, obrigado!
coldembrace

Ei, e se quisermos adicionar, por exemplo, uma nova página com o texto que está transbordando?
Nithin Sai

22

Você pode usar este código cortado para mostrar o texto com reticências

Text(
    "Introduction to Very very very long text",
    maxLines: 1,
    overflow: TextOverflow.ellipsis,
    softWrap: false,
    style: TextStyle(color: Colors.black, fontWeight: FontWeight.bold),
),

11
Também inclua uma descrição desse código para explicar como ele responde à pergunta.
jkdev

14

Você pode fazer assim

Expanded(
   child: Text(
   'Text',
   overflow: TextOverflow.ellipsis,
   maxLines: 1
   )
)

8

primeiro, envolva seu Rowou Columnem um widget Flexibleou, em Expandedseguida

Text(
    'your long text here',
    overflow: TextOverflow.fade,
    maxLines: 1,
    softWrap: false,
    style: Theme.of(context).textTheme.body1,
)

Sim, esse é o caminho certo, primeiro envolver a Coluna dentro do Expandido realmente funcionou! e usar o texto dentro dos filhos da coluna.
ArifMustafa


4

Uma maneira de corrigir um estouro de um widget de texto dentro de uma linha se, por exemplo, uma mensagem de bate-papo puder ser uma linha muito longa. Você pode criar um Container e um BoxConstraint com um maxWidth nele.

            Container(
              constraints: BoxConstraints(maxWidth: 200),
                child: Text(
                  (chatName == null) ? " ": chatName,
                  style: TextStyle(
                      fontWeight: FontWeight.w400,
                      color: Colors.black87,
                      fontSize: 17.0),
                )
            ),

isso funcionou para mim, obrigado
aida

3
SizedBox(
    width: 200.0,
    child: Text('PRODUCERS CAVITY FIGHTER 50X140g',
                overflow: TextOverflow.ellipsis,
                style: Theme.of(context).textTheme.body2))

Basta envolver dentro de um widget que pode ter uma largura específica para funcionar ou assumirá a largura do contêiner pai.


0

Acho que o Container pai precisa receber um maxWidth do tamanho adequado. Parece que a caixa de texto irá preencher qualquer espaço fornecido acima.


0

Dependendo da sua situação, acho que essa é a melhor abordagem a seguir.

final maxWidth = MediaQuery.of(context).size.width * 0.4;
Container(
        textAlign: TextAlign.center),
        child: Text('This is long text',
        constraints: BoxConstraints(maxWidth: maxWidth),
),

0

Se você simplesmente colocar o texto como filho (s) de uma coluna, esta é a maneira mais fácil de quebrar o texto automaticamente. Supondo que você não tenha nada mais complicado acontecendo. Nesses casos, acho que você criaria seu contêiner com o tamanho que achar melhor e colocaria outra coluna dentro e depois seu texto. Isso parece funcionar bem. Os contêineres querem diminuir para o tamanho de seu conteúdo, e isso parece entrar em conflito natural com a embalagem, que requer mais esforço.

Column(
  mainAxisSize: MainAxisSize.min,
  children: <Widget>[
    Text('This long text will wrap very nicely if there isn't room beyond the column\'s total width and if you have enough vertical space available to wrap into.',
      style: TextStyle(fontSize: 16, color: primaryColor),
      textAlign: TextAlign.center,),
  ],
),

0

Existem muitas respostas, mas haverá mais algumas observações.

1. clipe

Corte o texto transbordando para corrigir seu contêiner.

SizedBox(
          width: 120.0,
          child: Text(
            "Enter Long Text",
            maxLines: 1,
            overflow: TextOverflow.clip,
            softWrap: false,
            style: TextStyle(color: Colors.black, fontWeight: FontWeight.bold, fontSize: 20.0),
          ),
        ),

Resultado:

insira a descrição da imagem aqui

2. desvanecer

Fade o texto transbordando para transparente.

SizedBox(
          width: 120.0,
          child: Text(
            "Enter Long Text",
            maxLines: 1,
            overflow: TextOverflow.fade,
            softWrap: false,
            style: TextStyle(color: Colors.black, fontWeight: FontWeight.bold, fontSize: 20.0),
          ),
        ), 

Resultado:

insira a descrição da imagem aqui

3. elipse

Use reticências para indicar que o texto transbordou.

SizedBox(
          width: 120.0,
          child: Text(
            "Enter Long Text",
            maxLines: 1,
            overflow: TextOverflow.ellipsis,
            softWrap: false,
            style: TextStyle(color: Colors.black, fontWeight: FontWeight.bold, fontSize: 20.0),
          ),
        ),

Resultado:

insira a descrição da imagem aqui

4.visível

Renderize o texto transbordando fora de seu contêiner.

SizedBox(
          width: 120.0,
          child: Text(
            "Enter Long Text",
            maxLines: 1,
            overflow: TextOverflow.visible,
            softWrap: false,
            style: TextStyle(color: Colors.black, fontWeight: FontWeight.bold, fontSize: 20.0),
          ),
        ),

Resultado:

insira a descrição da imagem aqui


-3

Experimentar:

 Expanded(
  child: Container(
      child: Text('OVER FLOW TEST TEXTTTT',
          overflow: TextOverflow.fade)),
),

Isso vai mostrar OVER FLOW. Se houver um estouro, ele será tratado.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.