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

rafaelcb21
fonte

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,
      ),
    ),
  ),
),
Collin Jackson
fonte
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(),
)
CopsOnRoad
fonte
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),
),
Yauhen Sampir
fonte
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
   )
)
Cenk YAGMUR
fonte
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,
)
Abdurahman Popal
fonte
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),
                )
            ),
Justin B
fonte
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.

chisom onwuegbuzie
fonte
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.

Randal Schwartz
fonte
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),
),
Alish Giri
fonte
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,),
  ],
),
Jbryanh
fonte
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

jitsm555
fonte
-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.

Bilal BSL
fonte