Flutter Multiline для текста

Все, что мне нужно, это сделать мой текст многострочным. Я даю свойство maxLines, но он все еще получает ошибку переполнения RenderFlex справа, поскольку следующая не идет на вторую строку,

      Align( alignment: Alignment.bottomCenter,
      child: new ButtonBar(
        alignment: MainAxisAlignment.center,
        children: <Widget>[
          Padding(
            padding: EdgeInsets.all(20.0),
            child: new Text(
              "This is a very bigggggggg text !!!",textDirection: TextDirection.ltr,
              style: new TextStyle(fontSize: 20.0, color: Colors.white),
              maxLines: 2,
            ),
          )
        ],
      ),
    )

Я исправил, удалив дочерний элемент ButtonBar

Vivek C A 17.12.2018 10:15

Превратите текстовый виджет в гибкий или расширенный виджет.

Shakeeb Siddiqui 10.03.2019 12:43
54
2
113 966
9

Ответы 9

Думаю, вы забыли добавить тип overflow.

Вы можете использовать что-то вроде этого:

Text(
     "TOP ADDED",
     textAlign: TextAlign.justify,
     overflow: TextOverflow.ellipsis,
     style: TextStyle(fontSize: 18.0),
     maxLines: 2,)

Может быть, попробовать использовать TextField:

new TextField(
  keyboardType: TextInputType.multiline,
  maxLines: 2,
)

Обновленный тент

Я наткнулся на это видео на официальном канале Flutter, который довольно хорошо объясняет эту проблему. Они рекомендуют использовать виджет LimitedBox.

Короткий ответ

Все, что требуется для многострочного текста, - это то, что ширина ваших виджетов Text() ограничена родительским виджетом. Например:

SizedBox(
    width: 150,
    child: Text(
    "This text is very very very very very very very very very very very very very very very very very very very very very very very very very long",
    ),
),

Длинный ответ

Минимальный рабочий пример + пояснение:

import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold( //Text widgets, multi-line or not, need a Scaffold widget somewhere up the widget tree.
        body: Row( //Widgets which help to display a list of children widgets are the 'culprit', they make your text widget not know what the maximum width is. In OP's example it is the ButtonBar widget.
          children: [
            Container( 
              width: 100, //This helps the text widget know what the maximum width is again! You may also opt to use an Expanded widget instead of a Container widget, if you want to use all remaining space.
              child: Center( //I added this widget to show that the width limiting widget doesn't need to be a direct parent.
                child: Text(
                  "This text is very very very very very very very very very very very very very very very very very very very very very very very very very long",
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

Дополнительный

Вы также упомянули maxlines. Это свойство ограничивает максимальное количество строк. Если это то, что вы хотите, я рекомендую вам также поиграть со свойством overflow.

SizedBox(
  width: 100,
  child: Text(
    "This text is very very very very very very very very very very very very very very very very very very very very very very very very very long",
    maxLines: 2,
    overflow: TextOverflow.ellipsis,
  ),
),

Это объяснение очень хорошее: точное, лаконичное, правильное. Хотелось бы, чтобы у нас была официальная документация по Flutter (руководства / инструкции), написанная в этом стиле.

Dvinubius 15.02.2021 20:09

Если я использую TextOverFlow.ellipsis и оборачиваю виджет Text с помощью SingleChildScrollView, текст не прокручивается. Но если я удалю TextOverFlow.ellipsis, текст будет прокручиваться, как и ожидалось. Можно ли использовать TextOverFlow.ellipsis и SingleChildScrollView?

Richardd 18.02.2021 00:32

Лучший подход к использованию ограничений stackoverflow.com/a/55431670/7429464

FindOutIslamNow 14.05.2021 07:33

попробуй это:

Expanded(            
    child: Text(
      'a long text',
      overflow: TextOverflow.clip,
    ),
),

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

и вот полный пример того, как заставить его реагировать даже по вертикали, а не только по горизонтали:

Card(
  child: InkWell(
    onTap: (){},
    child: Padding(
      padding: const EdgeInsets.all(8.0),
      child: Row(
        children: <Widget>[
          SizedBox(
            height: 70, // default\minimum height
          ),
          Container(
            height: 44,
            width: 44,
            decoration: BoxDecoration(
                color: Colors.blue,
                borderRadius: BorderRadius.all(Radius.circular(22))),
          ),
          SizedBox(
            width: 15,
          ),
          Expanded(
            child: Text(
              'the very long title',
              overflow: TextOverflow.clip,
            ),
          ),
          SizedBox(
            width: 10,
          ),
          Text(
            'value', //some other text in the end of the card or maybe an icon instead
          ),
          SizedBox(
            width: 30,
          ),
        ],
      ),
    ),
  ),
)

Просто оберните свой текстовый виджет расширенным, как показано ниже

    Expanded(
      child: Text('data', maxLines: 4,
        overflow: TextOverflow.ellipsis,
        textDirection: TextDirection.rtl,
        textAlign: TextAlign.justify,),
    ),

Вы можете использовать эту уловку. Text( ''' This is very big text''' ), Просто заключите текст в три одинарные кавычки, и flutter отформатирует текст в соответствии с его длиной. Нет необходимости использовать максимальное количество строк и текстовое поле.

работает, если вы добавляете \n в качестве разрывов строки в вашей строке. Неважно, используете ли вы тройные или обычные кавычки. Не понимаю всех голосов против.

Throvn 03.10.2021 19:28

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

Expanded(child: 
 Column(crossAxisAlignment: CrossAxisAlignment.start ,
 children: [
            Text(food.title),
            Text(food.price)
           ]
))

Лучший способ справиться с этим:

Expanded(
child: Text(document['content'],
textAlign: TextAlign.start,
overflow: TextOverflow.ellipsis,
maxLines: 20,
))

Просто оберните текстовый виджет в гибкий. Поскольку он использует только необходимое пространство. После maxLines он просто сокращается до многоточия.

If you want unlimited lines, just remove maxLines attribute. With the help of Flexible, it uses space which widget needs.

Flexible(
  child: Text('Long Text', maxLines: 3,
    overflow: TextOverflow.ellipsis,
    textAlign: TextAlign.justify,
  ),
),

Другие вопросы по теме