Стек: покрыть нижний дочерний элемент верхним дочерним элементом

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

что у меня есть:

чего я хочу добиться:

Row(
    crossAxisAlignment: CrossAxisAlignment.start,
    mainAxisAlignment: MainAxisAlignment.start,
    children: [
      Text(
        'Winner: ',
        style: TextStyle(fontSize: 34),
      ),
      Stack(
        children: [
          Text('YOU!!!', style: TextStyle(fontSize: 34)),
          Container(
            color: Colors.amber,
          )
        ],
      ),
    ],
  ),

Это упрощенная версия того, чего я хочу достичь. Я должен использовать Row и предполагать, что Texts - это любой виджет любого размера.

Размер стека своих дочерних элементов основан на Ограничении, которое он получает от родителя, а не на основе дочерних размеров.

как я могу наложить верхний виджет с точным размером нижнего виджета?

это помогает?

Paul 21.12.2020 09:32

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

Hashem Aboonajmi 21.12.2020 10:02
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
2
221
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Чтобы узнать размер вашего widget и применить вещи в зависимости от этого, вы можете использовать GlobalKey вот так GlobalKey key;. Инициализируйте его в своем initSate и слушайте его размер

GlobalKey key;
double yourWidgetWidth;
double yourWidgetHeight;

@override
initState() {
   // .... other stuffs
   
   key = GlobalKey();

   WidgetsBinding.instance.addPostFrameCallback((_) {
      if (mounted) {
         yourWidgetWidth = containerKey.currentContext.size.width;
         yourWidgetHeight = containerKey.currentContext.size.height;
      }
   });
}

А с yourWidgetWidth и yourWidgetHeight можно добиться желаемого

Редактировать Вот концепция того, что я пытаюсь объяснить

// In variable declaration scope
GlobalKey youTextKey = GlobalKey();
ValueNotifier widthNotifier = ValueNotifier(0);
ValueNotifier heightNotifier = ValueNotifier(0);

// In initState
WidgetsBinding.instance.addPostFrameCallback((_) {
  if (mounted) {
    widthNotifier.value = youTextKey.currentContext.size.width - 1.0;
    heightNotifier.value = youTextKey.currentContext.size.height - 5.0;
  }
});

// Your row
Row(
  crossAxisAlignment: CrossAxisAlignment.start,
  mainAxisAlignment: MainAxisAlignment.start,
  children: [
    Text(
      'Winner: ',
      style: TextStyle(fontSize: 34),
    ),
    Stack(
      children: [
        Text('YOU!!!', style: TextStyle(fontSize: 34), key: youTextKey,),
        ValueListenableBuilder(
          valueListenable: widthNotifier,
          builder: (context, width, _) {
            return ValueListenableBuilder(
              valueListenable: heightNotifier,
              builder: (context, height, _) {
                return Container(
                  width: width,
                  height: height,
                  color: Colors.amber,
                );
              },
            );
          },
        ),
      ],
    ),
  ],
)

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

Hashem Aboonajmi 21.12.2020 09:52

Я сталкивался с такими вещами в прошлом. Может быть, вы можете проверить мое новое редактирование

dm_tr 21.12.2020 10:04

Спасибо за участие, смотрите ответ

Hashem Aboonajmi 21.12.2020 10:31
Ответ принят как подходящий

Использование Positioned.Fill решило проблему:

Positioned.Fill Создает позиционированный объект с [слева], [сверху], [справа] и [снизу], установленными на 0,0, если для них не передано значение. поэтому позиционированный дочерний элемент растягивается до краев самого большого дочернего элемента стека.

Row(
    crossAxisAlignment: CrossAxisAlignment.start,
    mainAxisAlignment: MainAxisAlignment.start,
    children: [
      Text(
        'Winner: ',
        style: TextStyle(fontSize: 34),
      ),
      Stack(
        children: [
          Text('YOU!!!', style: TextStyle(fontSize: 34)),
          Positioned.fill(
            child: Container(
              color: Colors.amber,
            ),
          )
        ],
      ),
    ],
  ),

Действительно, это эффективнее!

dm_tr 21.12.2020 10:33

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