Flutter — 3 виджета внутри строки, выровняйте по правому краю последний

#flutter #layout #alignment #row

#flutter #макет #выравнивание #строка

Вопрос:

Макет определяется как foollows:

 Flexible(child: new Container(
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    Padding(
                      child: Row(
                          children: <Widget>[
                        Padding(
                            padding: EdgeInsets.only(right: 8.0),
                            child: Text(categoryIcon,
                                style: TextStyle(
                                    color: Colors.lightBlue,
                                    fontFamily: 'Fontawesome',
                                    fontWeight: FontWeight.normal))),
                        Flexible(
                            child: Text(categoryName,
                                maxLines: 3,
                                style: TextStyle(
                                    color: Colors.lightBlue,
                                    fontWeight: FontWeight.normal))),

                        Text("#33088",
                            style: TextStyle(
                                color: Colors.black26,
                                fontWeight: FontWeight.normal))

                      ]),
                      padding: EdgeInsets.only(
                          bottom: 3.0, left: 8.0, top: 10.0, right: 5.0),
                    ),
                    Padding(
                      child: Text(title,
                          maxLines: 3,
                          overflow: TextOverflow.ellipsis,
                          style: TextStyle(
                              fontWeight: FontWeight.normal, fontSize: 16)),
                      padding: EdgeInsets.only(
                          bottom: 3.0, left: 8.0, top: 10.0, right: 5.0),
                    ),

                    Padding(
                      child: new Text(address,
                          style: TextStyle(fontStyle: FontStyle.normal)),
                      padding: EdgeInsets.only(
                          bottom: 10.0, left: 8.0, top: 10.0, right: 5.0),
                    ),
                    Visibility(
                      child: Padding(
                        child: new Text("⬤  "   statusName,
                            style: TextStyle(
                                fontStyle: FontStyle.normal,
                                color: HexColor(statusColor))),
                        padding:
                        EdgeInsets.only(bottom: 10.0, left: 8.0, top: 0.0),
                      ),
                      visible: type == ResponseMessageType.MESSAGE_TYPE_EVENT ||
                          type == ResponseMessageType.MESSAGE_TYPE_MY_EVENT,
                    )
                  ],
                ),
              ));
 

Я получаю результат:

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

Поэтому всегда, когда виджет второй строки (метка) переносится в текст, метка выравнивается по правому краю, если нет, то метка вообще не выравнивается. Если я попытаюсь:

 Row(
                          children: <Widget>[
                        Padding(
                            padding: EdgeInsets.only(right: 8.0),
                            child: Text(categoryIcon,
                                style: TextStyle(
                                    color: Colors.lightBlue,
                                    fontFamily: 'Fontawesome',
                                    fontWeight: FontWeight.normal))),
                        Flexible(
                            child: Text(categoryName,
                                maxLines: 3,
                                style: TextStyle(
                                    color: Colors.lightBlue,
                                    fontWeight: FontWeight.normal))),
                        Spacer(),

                        Text("#33088",
                            style: TextStyle(
                                color: Colors.black26,
                                fontWeight: FontWeight.normal))

                      ])
 

Я неправильно переношу строку метки и по-прежнему не выравниваю метку по правому краю, когда текст метки не переносится:

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

Мне нужно, чтобы мой список выглядел так, как на первом рисунке, но метка «# 33088» всегда должна быть выровнена по правому краю, независимо от того, завернута метка категории или нет. Метку категории необходимо обернуть, когда не останется свободного места, а также меткой «# 33088».

Как это сделать правильно?

[править / править код]

Частично основываясь на приведенных ниже ответах, похоже, это сработало:

 Row(
                          children: <Widget>[
                        Padding(
                            padding: EdgeInsets.only(right: 8.0),
                            child: Text(
                                categoryIcon,
                                style: TextStyle(color: Colors.lightBlue, fontFamily: 'Fontawesome', fontWeight: FontWeight.normal))),

                            Flexible(
                                child: Row(
                                  children: [
                                    Flexible(
                                      child: Text(categoryName,
                                          maxLines: 3,
                                          style: TextStyle(color: Colors.lightBlue, fontWeight: FontWeight.normal)),
                                ),
                              ],
                            )),

                        Visibility(
                          visible: type == ResponseMessageType.MESSAGE_TYPE_EVENT,
                          child: Expanded(
                            flex: 0,
                            child: Text("#"   id, style: TextStyle(color: Colors.black26, fontWeight: FontWeight.normal)),
                          ),
                        )

                      ])
 

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

 Flexible(
                                child: Row(
                                  children: [
                                    Flexible(
                                      child: Text(categoryName,
                                          maxLines: 3,
                                          style: TextStyle(color: Colors.lightBlue, fontWeight: FontWeight.normal)),
                                ),
                              ],
                            )),
 

Если я поставлю Flexible вместо него один:

 Flexible(
          child: Text(categoryName,
          maxLines: 3,
          style: TextStyle(color: Colors.lightBlue, fontWeight: FontWeight.normal)),
        )   
 

Снова метка #id не выровнена. С строкой, содержащей один гибкий, снова обернутый гибким, кажется, работает.

Ответ №1:

Проверьте атрибуты тени и высоты границы, надеюсь, вы найдете свой ответ

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

1. Любые подробности, что вы имеете в виду? Вы неправильно поняли мой вопрос, я не имею в виду высоту карты, я имею в виду метки внутри нее

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

Ответ №2:

 Flexible(child: new Container(
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    Padding(
                      child: Row(
                          children: <Widget>[
                        Expanded( // here
 

Попробуйте использовать расширенный

Ответ №3:

  Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                mainAxisSize: MainAxisSize.max,
                crossAxisAlignment: CrossAxisAlignment.start,
                children: <Widget>[
                  Flexible(
                    flex: 1,
                    child: Row(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: [
                        Icon(
                          Icons.flash_on,
                        ),
                        Flexible(
                          child: Text(
                            "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod",
                            maxLines: 3,
                            style: TextStyle(
                              color: Colors.lightBlue,
                              fontWeight: FontWeight.normal,
                            ),
                          ),
                        ),
                      ],
                    ),
                  ),
                  Text(
                    "#33088",
                    style: TextStyle(
                      color: Colors.black26,
                      fontWeight: FontWeight.normal,
                    ),
                  )
                ],
              )
 

Ответ №4:

В строке оберните первые три виджета с помощью expanded (каждый виджет оберните с помощью expanded), а затем четвертый виджет автоматически выровняется по правому краю

и ваш код будет выглядеть так

 Flexible(child: new Container(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                Expanded(
                                      child: Padding(
                    child: Row(
                        children: <Widget>[
                      Padding(
                          padding: EdgeInsets.only(right: 8.0),
                          child: Text(categoryIcon,
                              style: TextStyle(
                                  color: Colors.lightBlue,
                                  fontFamily: 'Fontawesome',
                                  fontWeight: FontWeight.normal))),
                      Flexible(
                          child: Text(categoryName,
                              maxLines: 3,
                              style: TextStyle(
                                  color: Colors.lightBlue,
                                  fontWeight: FontWeight.normal))),

                      Text("#33088",
                          style: TextStyle(
                              color: Colors.black26,
                              fontWeight: FontWeight.normal))

                    ]),
                    padding: EdgeInsets.only(
                        bottom: 3.0, left: 8.0, top: 10.0, right: 5.0),
                  ),
                ),
                Expanded(
                                      child: Padding(
                    child: Text(title,
                        maxLines: 3,
                        overflow: TextOverflow.ellipsis,
                        style: TextStyle(
                            fontWeight: FontWeight.normal, fontSize: 16)),
                    padding: EdgeInsets.only(
                        bottom: 3.0, left: 8.0, top: 10.0, right: 5.0),
                  ),
                ),

                Expanded(
                                      child: Padding(
                    child: new Text(address,
                        style: TextStyle(fontStyle: FontStyle.normal)),
                    padding: EdgeInsets.only(
                        bottom: 10.0, left: 8.0, top: 10.0, right: 5.0),
                  ),
                ),
                Visibility(
                  child: Padding(
                    child: new Text("⬤  "   statusName,
                        style: TextStyle(
                            fontStyle: FontStyle.normal,
                            color: HexColor(statusColor))),
                    padding:
                    EdgeInsets.only(bottom: 10.0, left: 8.0, top: 0.0),
                  ),
                  visible: type == ResponseMessageType.MESSAGE_TYPE_EVENT ||
                      type == ResponseMessageType.MESSAGE_TYPE_MY_EVENT,
                )
              ],
            ),
          )),