Flutter: как разместить виджет ниже виджета с фиксированным центром внутри контейнера

#flutter #widget #flutter-layout

#flutter #виджет #flutter-макет

Вопрос:

Как разместить виджет ниже виджета с фиксированным центром внутри контейнера? Я использую GridView для отображения виджетов по горизонтали. Элемент GridView будет иметь текстовый виджет, который должен быть зафиксирован в центре экрана каждый раз. Я должен разместить текстовый виджет под этим виджетом с центром.

Скриншот ссылки: введите описание изображения здесь

Добавление кода метода сборки элемента GridView, который я пробовал до сих пор. Но текстовый виджет не центрируется. Результат, который я получаю. Как исправить эту часть?

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

 @override
Widget build(BuildContext context) {
  return Column(
    mainAxisAlignment: MainAxisAlignment.center,
    children: [
      CustomText(
        (dayModel?.date?.day ?? "").toString(),
        AppTextStyle.Body,
        customColor: _getColorBasedOnStyle(
          dayModel.style,
        ),
      ),
      Visibility(
        visible: dayModel?.style == CalendarDayStyles.NOT_AVAILABLE,
        child: CustomText(
          Strings.no_slots_label,
          AppTextStyle.SublineForCalendar,
          customColor: AppColors.BLACK_20,
        ),
      ),
    ],
  );
}
 

Ответ №1:

Я считаю, что секрет правильного выполнения этого заключается не только в том, как вы строите «6», но и в том, как вы строите «5» и «7».

Например, вы могли бы построить каждый из них в виде столбца с 3 полями друг над другом, псевдокод:

 Column(
 children: [
  SizedBox(height: fixedHeight, child: empty)
  SizedBox(height: fixedHeight, child: Text("5"))  // or "6" or "7"
  SizedBox(height: fixedHeihgt, child: empty) // or booking status
 ]
)
 

или другой способ сделать это, если нам нужно избежать использования fixedHeight, — использовать Expanded виджет внутри Column виджета

 Column(
 children: [
  Expanded(child: Container()),
  Expanded(child: Center(child : Text("5"))), // or "6" or "7"
  Expanded(child: Center(child : Text("No Slots"))) // or booking status
 ]
)
 

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

1. @rgisi обновил ответ, используя расширенный виджет. Спасибо за идею, это сработало.

Ответ №2:

Если вы установите для строки start значение crossAxisAlignment, а затем отобразите столбец с надписью «без слотов» внизу, разве это не должно решить вашу проблему?

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

1. Я не использую строку в вышеуказанных виджетах

Ответ №3:

Вы могли бы использовать CrossAxisAlignment.center :

 Column(
 mainAxisAlignment: MainAxisAlignment.center,
 crossAxisAlignment: CrossAxisAlignment.center,
),
 

Полный фрагмент кода:

 @override
Widget build(BuildContext context) {
  return Column(
    mainAxisAlignment: MainAxisAlignment.center,
    crossAxisAlignment: CrossAxisAlignment.center,
    children: [
      CustomText(
        (dayModel?.date?.day ?? "").toString(),
        AppTextStyle.Body,
        customColor: _getColorBasedOnStyle(
          dayModel.style,
        ),
      ),
      Visibility(
        visible: dayModel?.style == CalendarDayStyles.NOT_AVAILABLE,
        child: CustomText(
          Strings.no_slots_label,
          AppTextStyle.SublineForCalendar,
          customColor: AppColors.BLACK_20,
        ),
      ),
    ],
  );