Flutter - перенос текста при переполнении, например, вставка многоточия или затухание

123

Я пытаюсь создать строку, в которой центральный текст имеет максимальный размер, и если текстовое содержимое слишком велико, оно соответствует размеру.

Я вставляю TextOverflow.ellipsisсвойство для сокращения текста и вставки тройных точек, ...но оно не работает.

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

результат:

введите описание изображения здесь

ожидается:

введите описание изображения здесь

rafaelcb21
источник

Ответы:

251

Вы должны завернуть его Containerв, Flexibleчтобы сообщить Row, что это нормально, если он Containerбудет уже, чем его внутренняя ширина. Expandedтоже будет работать.

Скриншот

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
У меня аналогичная проблема с колонкой. Этот подход мне не подходит. stackoverflow.com/questions/52206221/…
Майкл Тедла 06
есть ли способ реализовать это в текстовом поле?
mangkool
если вы хотите, чтобы текст wrap_content также указывал свойство fit с помощью FlexFit.loose,
martinseal1987
110

Использование многоточия

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

введите описание изображения здесь


Использование Fade

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

введите описание изображения здесь


Использование клипа

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

введите описание изображения здесь


Примечание:

Если вы используете Textвнутри a Row, вы можете поместить выше Textвнутри, Expandedнапример:

Expanded(
  child: AboveText(),
)
CopsOnRoad
источник
Могу ли
@ mr.hir Мне жаль, что я этого не понял.
CopsOnRoad
Это не работает, если у вас есть текст и другой виджет (например, значок) в центре строки.
Лукаш Частко
softWrap: falseименно то, что мне нужно, спасибо!
холодные объятия
Эй, а что если мы хотим добавить, например, новую страницу с переполненным текстом?
Нитхин Сай,
22

Вы можете использовать этот фрагмент кода для отображения текста с многоточием

Text(
    "Introduction to Very very very long text",
    maxLines: 1,
    overflow: TextOverflow.ellipsis,
    softWrap: false,
    style: TextStyle(color: Colors.black, fontWeight: FontWeight.bold),
),
Евгений Сампир
источник
11
Также включите описание этого кода, чтобы объяснить, как он отвечает на вопрос.
jkdev
14

Вы можете сделать это так

Expanded(
   child: Text(
   'Text',
   overflow: TextOverflow.ellipsis,
   maxLines: 1
   )
)
Дженк ЯГМУР
источник
8

сначала оберните Rowили Columnв виджет Flexibleили, Expandedзатем

Text(
    'your long text here',
    overflow: TextOverflow.fade,
    maxLines: 1,
    softWrap: false,
    style: Theme.of(context).textTheme.body1,
)
Абдурахман Попал
источник
Да, это правильный способ, сначала обернуть столбец внутри расширенного действительно сработало! и использовать текст внутри дочерних столбцов.
ArifMustafa
5

Один из способов исправить переполнение текстового виджета внутри строки, если, например, сообщение чата может быть одной действительно длинной строкой. Вы можете создать Контейнер и BoxConstraint с maxWidth в нем.

            Container(
              constraints: BoxConstraints(maxWidth: 200),
                child: Text(
                  (chatName == null) ? " ": chatName,
                  style: TextStyle(
                      fontWeight: FontWeight.w400,
                      color: Colors.black87,
                      fontSize: 17.0),
                )
            ),
Джастин Б.
источник
это сработало для меня, спасибо
Аида
4

Перенос, чьи дочерние элементы находятся в строке или столбце, пожалуйста, переносите столбец или строку в новый гибкий ();

https://github.com/flutter/flutter/issues/4128

Ото-обонг Эшиетт
источник
3
SizedBox(
    width: 200.0,
    child: Text('PRODUCERS CAVITY FIGHTER 50X140g',
                overflow: TextOverflow.ellipsis,
                style: Theme.of(context).textTheme.body2))

Просто оберните его внутрь виджета, который может принимать определенную ширину для работы, или он будет принимать ширину родительского контейнера.

Chisom Onwuegbuzie
источник
0

Я думаю, что родительскому контейнеру нужно дать maxWidth правильного размера. Похоже, текстовое поле заполнит все пространство, указанное выше.

Рэндал Шварц
источник
0

В зависимости от вашей ситуации, я думаю, что это лучший подход, представленный ниже.

final maxWidth = MediaQuery.of(context).size.width * 0.4;
Container(
        textAlign: TextAlign.center),
        child: Text('This is long text',
        constraints: BoxConstraints(maxWidth: maxWidth),
),
Алиш Гири
источник
0

Если вы просто поместите текст как дочерний (рен) столбца, это самый простой способ автоматического переноса текста. Если у вас нет ничего более сложного. В таких случаях я бы подумал, что вы создадите свой контейнер, размер которого вы считаете нужным, и поместите внутрь еще один столбец, а затем свой текст. Кажется, это хорошо работает. Контейнеры хотят сжиматься до размеров своего содержимого, и это, кажется, естественным образом конфликтует с упаковкой, которая требует больших усилий.

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
источник
0

Есть много ответов, но будет еще несколько замечаний.

1. клип

Обрежьте переполненный текст, чтобы исправить его контейнер.

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

Вывод:

введите описание изображения здесь

2. исчезнуть

Сделайте переполненный текст прозрачным.

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

Вывод:

введите описание изображения здесь

3. эллипсис

Используйте многоточие, чтобы указать, что текст вышел за пределы.

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

Вывод:

введите описание изображения здесь

4. видимый

Рендеринг переполненного текста за пределами его контейнера.

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

Вывод:

введите описание изображения здесь

jitsm555
источник
-3

Пытаться:

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

Это покажет OVER FLOW. Если произойдет переполнение, это будет обработано.

Билал BSL
источник