Flutter: как заставить чип flutter расти и сжиматься в соответствии с длиной этикетки

#flutter

#flutter

Вопрос:

Я создаю микросхему flutter, где на этикетке есть HTML-текст tag (br) . Я бы хотел, чтобы метка прерывалась на основе тега «br и размера виджета чипа, чтобы отразить это.

Вот мой образец :

 Chip(
  avatar: CircleAvatar(
    backgroundColor: Colors.grey.shade800,
    child: Text('AB'),
  ),
  label: HtmlWidget('You have pushed the button <br>this many times:'),
),
  

Я использую «flutter_widget_from_html_core» для рендеринга html.

Текст переносится, но виджет остается того же размера

не могли бы вы сообщить мне, как это исправить или альтернативный вариант

пример

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

Ответ №1:

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

Простое исправление должно сработать.

РЕДАКТИРОВАТЬ: этот код также является адаптивным, просто передайте responsive:true

 class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Chip(
      avatar: CircleAvatar(
        backgroundColor: Colors.grey.shade800,
        child: Text('AB'),
      ),
      label: ResponsiveBrTag(
        'You have pushed the button very hard <br> this many times:',
      ),
    );
  }
}

class ResponsiveBrTag extends StatelessWidget {
  final String htmlText;
  final bool responsive;
  const ResponsiveBrTag(this.htmlText, {this.responsive = false});
  @override
  Widget build(BuildContext context) {
    var splits = htmlText.split("<br>");
    var fixedLayout = Column(
      children: splits.map((s) => Text(s)).toList(),
      mainAxisSize: MainAxisSize.min,
      crossAxisAlignment: CrossAxisAlignment.start,
    );
    var respLayout = Wrap(children: splits.map((s) => Text(s)).toList());

    return responsive ? respLayout : fixedLayout;
  }
}
  

Примечание: я не полностью протестировал его на наличие ошибок, это всего лишь пример кода.

Комментарии:

1. добавлен адаптивный макет, а также исправленный макет.