Flutter - Оберніть текст на переповнення, як-от вставити еліпсис або зникати


121

Я намагаюся створити рядок, у якому текст тексту має максимальний розмір, і якщо вміст тексту занадто великий, він підходить за розміром.

Я вставляю TextOverflow.ellipsisвластивість скорочувати текст і вставляти потрійні точки, ...але це не працює.

головна.дарт

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

результат:

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

очікується:

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

Відповіді:


250

Ви повинні обернути 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,
      ),
    ),
  ),
),

1
У мене схожа проблема на Column. Цей підхід для мене не працює. stackoverflow.com/questions/52206221 / ...
Michael Tedla

чи є можливість ми реалізувати це в текстовому полі?
mangkool

якщо ви хочете, щоб він також мав текст wrap_content, вкажіть властивість fit за допомогою FlexFit.loose,
martinseal1987

108

Використання Ellipsis

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всередині Row, ви можете поставити його Textвсередині, Expandedяк:

Expanded(
  child: AboveText(),
)

Чи можу я додати, коли текст переповнюється, потім додати плоску кнопку, як ... докладніше посилання
mr.hir

@ mr.hir Вибачте, що цього не зрозумів.
CopsOnRoad

Це не працює, якщо у вас є текст та інший віджет (наприклад, значок), зосереджений усередині рядка.
Лукаш Ціастко

softWrap: falseсаме те, що мені було потрібно, дякую!
coldembrace

Гей, що робити, якщо ми хочемо додати, наприклад, нову сторінку з текстом, який переповнюється?
Нітін Сай

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

Так, це правильний спосіб: спочатку загортання стовпця всередині розширеного дійсно спрацювало! і використовувати Текст всередині дітей у колонці.
АріфМустафа


4

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

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

це працювало для мене завдяки
аїда,

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

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


0

Я думаю, що батьківському контейнерові потрібно надати максимальну ширину належного розміру. Схоже, поле «Текст» заповнить будь-яке простір, вказане вище.


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

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

Вихід:

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


-3

Спробуйте:

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

Це покаже OVER FLOW. Якщо є перелив, він буде оброблятися.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.