Flutter - Envelopper le texte en cas de dépassement, comme insérer des points de suspension ou fondu


123

J'essaie de créer une ligne dans laquelle le texte central a une taille maximale, et si le contenu du texte est trop grand, il s'adapte à la taille.

J'insère la TextOverflow.ellipsispropriété pour raccourcir le texte et insérer les points triples ...mais cela ne fonctionne pas.

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)
                            ),
                          ),
                        ],
                      ),
                    ]
                  )
                )
              ],
            ),
          )
        ),
      ]
    )
  );
}

résultat:

entrez la description de l'image ici

attendu:

entrez la description de l'image ici

Réponses:


251

Vous devriez envelopper votre Containerdans un Flexiblepour vous faire Rowsavoir qu'il est normal que le Containersoit plus étroit que sa largeur intrinsèque. Expandedfonctionnera également.

capture d'écran

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,
      ),
    ),
  ),
),

2
J'ai un problème similaire sur Column. Cette approche ne fonctionne pas pour moi. stackoverflow.com/questions/52206221/…
Michael Tedla

existe-t-il un moyen de l'implémenter dans textfield?
mangkool

si vous voulez qu'il ait également le texte wrap_content, spécifiez la propriété fit avec FlexFit.loose,
martinseal1987

110

Utiliser les ellipses

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

entrez la description de l'image ici


Utilisation de fondu

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

entrez la description de l'image ici


Utilisation du clip

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

entrez la description de l'image ici


Remarque:

Si vous utilisez Text intérieur de a Row, vous pouvez mettre ci-dessus à l' Textintérieur Expandedcomme:

Expanded(
  child: AboveText(),
)

puis-je ajouter lorsque le texte déborde, puis ajouter un bouton plat comme ... plus de lien
mr.hir

@ mr.hir Je suis désolé de ne pas avoir compris.
CopsOnRoad

Cela ne fonctionne pas si vous avez du texte et un autre widget (par exemple, une icône) centrés dans une ligne.
Lukasz Ciastko

softWrap: falseest exactement ce dont j'avais besoin, merci!
coldembrace

Hé, que faire si nous voulons ajouter, par exemple, une nouvelle page avec le texte qui déborde?
Nithin Sai

22

Vous pouvez utiliser ce code extrait pour afficher du texte avec des points de suspension

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

11
Veuillez également inclure une description de ce code pour expliquer comment il répond à la question.
jkdev

14

Tu peux le faire comme ça

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

8

d'abord, enveloppez votre Rowou Columndans un widget Flexibleou Expandedpuis

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

Oui, c'est la bonne façon, d'abord emballer la colonne à l'intérieur du Expanded a vraiment fonctionné! et d'utiliser le texte à l'intérieur des enfants Column.
ArifMustafa

5

Une façon de corriger un débordement d'un widget texte dans une ligne si, par exemple, un message de discussion peut être une très longue ligne. Vous pouvez créer un conteneur et un BoxConstraint avec un maxWidth dedans.

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

cela a fonctionné pour moi merci
aida


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

Enveloppez simplement dans un widget qui peut prendre une largeur spécifique pour qu'il fonctionne ou il prendra la largeur du conteneur parent.


0

Je pense que le conteneur parent doit recevoir un maxWidth de la taille appropriée. Il semble que la zone de texte remplisse l'espace donné ci-dessus.


0

Selon votre situation, je pense que c'est la meilleure approche ci-dessous.

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

0

Si vous placez simplement du texte comme enfant (s) d'une colonne, c'est le moyen le plus simple pour que le texte soit automatiquement enveloppé. En supposant que vous n'ayez rien de plus compliqué. Dans ces cas, je pense que vous créeriez votre conteneur de la taille que vous voulez et mettrez une autre colonne à l'intérieur, puis votre texte. Cela semble bien fonctionner. Les conteneurs veulent réduire la taille de leur contenu, ce qui semble naturellement entrer en conflit avec l'emballage, qui nécessite plus d'efforts.

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

Il y a beaucoup de réponses mais Will un peu plus de l'observation.

1. clip

Découpez le texte qui déborde pour corriger son conteneur.

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),
          ),
        ),

Production:

entrez la description de l'image ici

2. fondu

Fondu le texte qui déborde en transparent.

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),
          ),
        ), 

Production:

entrez la description de l'image ici

3. ellipse

Utilisez des points de suspension pour indiquer que le texte a débordé.

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),
          ),
        ),

Production:

entrez la description de l'image ici

4. visible

Rendre le texte débordant en dehors de son conteneur.

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),
          ),
        ),

Production:

entrez la description de l'image ici


-3

Essayer:

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

Cela montrera OVER FLOW. S'il y a un débordement, il sera traité.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.