Ограничить максимальную ширину контейнера во Flutter

  Widget build(context) {
    return Row(
      mainAxisSize: MainAxisSize.min,
      children: [
        Container(
          width: 300,
          padding: EdgeInsets.all(10),
          decoration: BoxDecoration(
            color: color ?? Colors.blue,
            borderRadius: BorderRadius.circular(10)
          ),
          child: msg
        )
      ],  
    );
  }

Это метод сборки моего виджета, и он отображает этот пользовательский интерфейс в зависимости от того, что я передаю как параметр msg.

  1. Загрузка текста Ограничить максимальную ширину контейнера во Flutter
  2. Какой-то очень длинный текст Ограничить максимальную ширину контейнера во Flutter

Теперь проблема, с которой я сталкиваюсь, заключается в том, что я не могу обернуть текст внутри этого контейнера/синего поля, не устанавливая его ширину, но если я установлю ширину контейнера/синего поля, тогда он всегда будет оставаться таким широким, независимо от того, насколько короткий текст .

Теперь есть способ установить maxWidth (например, 500) контейнера/синего ящика? Чтобы синее поле стало настолько широким, насколько требуется для мелкого текста, такого как «Загрузка», а для длинного текста оно расширится, пока не достигнет ширины 500 единиц, а затем перенесет текст?

Требуемый вывод для длинного текста:

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
65
0
84 951
10

Ответы 10

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

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

Nishant Desai 15.03.2019 21:04

Вы можете добавить ограничение в виджет контейнера с предпочтительным maxWidth следующим образом:

Widget build(context) {
return Row(
  mainAxisSize: MainAxisSize.min,
  children: [
    Container(
      constraints: BoxConstraints(minWidth: 100, maxWidth: 200),
      padding: EdgeInsets.all(10),
      decoration: BoxDecoration(
        color: color ?? Colors.blue,
        borderRadius: BorderRadius.circular(10)
      ),
      child: msg
    )
  ],  
);
}

Надеюсь, это поможет!

Используйте ConstrainedBox с BoxConstraintsmaxWidth, завернутым в виджет Flexible(). Гибкий виджет также позволяет изменять размер окна для небольших экранов.

Flexible(
  child: ConstrainedBox(
    constraints: BoxConstraints(maxWidth: 150),
    child: Container(
      color : Colors.blue,
      child: Text('Your Text here'),
    ),
  ),
),

Я только что попробовал, и проблема в том, что он переполняет экран, если экран не такой большой.

Roc Boronat 14.09.2020 14:51

Фиксированный! Просто поместите этот ConstrainerBox внутрь Flexible :·)

Roc Boronat 14.09.2020 14:53

Я знаю, что уже поздно, но кто-то может получить помощь в будущем.
Я использовал плагин auto_size_text, чтобы сделать это:

AutoSizeText(
  'A really long String',
  style: TextStyle(fontSize: 30),
  minFontSize: 18,
  maxLines: 4,
  overflow: TextOverflow.ellipsis,
)

Вот простой метод, который я использую для длинных текстов:

ConstrainedBox(
  constraints: BoxConstraints(maxWidth: 200),
  child: Container(
    child: Text(
      'Long string of text',
      maxLines: 2,
      overflow: TextOverflow.ellipsis,
    ),
  ),
)

Обратите внимание на атрибут maxLines, который может быть полезен, если вы хотите показать только одну строку текста.

Используйте свойство Constraints в виджете Container.

используйте значение maxWidth и minWidth для выполнения требования.

 Container(
      constraints: BoxConstraints(minWidth: 150, maxWidth: 300),
      padding: EdgeInsets.all(10),
      decoration: BoxDecoration(
        borderRadius: BorderRadius.circular(5)),
      child: Text("")
    )

Это должно быть внутри виджета Row или Column

1. Ряд

  Row(
      children: [
        Container(
            constraints: BoxConstraints(maxWidth: 300),
            decoration: BoxDecoration(
                borderRadius: BorderRadius.circular(8.0)),
            child: Text("Long Text....")
        ),
      ],
    );

2. Колонка

Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Container(
            constraints: BoxConstraints(maxWidth: 300),
            decoration: BoxDecoration(
                borderRadius: BorderRadius.circular(8.0)),
            child: Text("Long Text....")
        ),
      ],
    );

Здесь, в обоих примерах, это работает, потому что Column и Row позволяют своим дочерним элементам расширяться до заданного ограничения/размера.

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

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

return Row(
      children: [
          CommentBubble(
              chatText: snapshot.get('text'),
              sentAt: snapshot.get('sentAt'),
              sendBy: snapshot.get('sendBy'),
          ),
          Spacer(),
      ],
);

Вот как я это исправил

Center(
    child: Container(
      child: this.child,
      width: 300,
      height: double.infinity,
    ),
  )

Для меня, по крайней мере, установка поля Constrained в IntrinsicWidth решила проблему.

IntrinsicWidth(
  child: Container(
    constraints: BoxConstraints(maxWidth: 200),
    child: Row(
      children: [
       
      ],
    ),
  ),
);

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