наследование Constraints Flutter
void main() {
// Констрейнты экрана : width: double.infinity, height: double.infinity
runApp(
// Center наследует констрейнты от экрана и констрейнты становятся равными: width: double.infinity, height: double.infinity
// То есть Center принмает размеры экрана
Center(
child: Container(
// Container становится 100 на 100. Хотя он должен был унаследовать от Center констрейнты width: double.infinity, height: double.infinity
// и растянуть его на весь экран
// ВОПРОС: почему Container НЕ наследует "обновленные" констрейнты от Center ? и делает его именно 100 на 100
color: Colors.orange,
width: 100,
height: 100,
),
),
);
}
Вопрос такой. почему Center не передает Container-у констрейнты полученные от "экрана" ?
Ответы (1 шт):
Давайте разберемся по шагам:
Констрейнты от экрана:
runAppпредоставляет корневому виджету (в данном случаеCenter) констрейнты, которые обычно соответствуют размеру экрана или доступному пространству. В большинстве случаев этоwidth: double.infinity, height: double.infinity, что означает "занимай всю доступную ширину и высоту".Centerи констрейнты:Centerполучает эти констрейнты. Его задача - центрировать своего ребёнка в доступном пространстве. Чтобы это сделать,Centerне передаёт дочернему виджету те же самые констрейнты, которые получил сам. Вместо этого,Centerпозволяет дочернему виджету самому выбрать свой размер, в пределах полученных констрейнтов, и затем центрирует его.Ключевой момент:
Centerне заставляет дочерний виджет занимать все доступное пространство. Он лишь предлагает ему пространство и центрирует его, независимо от того, какой размер выберет дочерний виджет (в пределах констрейнтов).Containerи констрейнты:Если
Containerне имеет явно заданныхwidthиheight, он попытается занять максимально возможное пространство, которое ему позволяют констрейнты от родителя. В этом случае, если быCenterпередалContainer-у констрейнтыwidth: double.infinity, height: double.infinity, тоContainerбез размеров действительно растянулся бы на весь экран.Но! В вашем коде вы явно задаёте
width: 100иheight: 100дляContainer. КогдаContainerполучает констрейнты отCenter, и видит, что у него заданы размеры, он игнорирует большую часть констрейнтов, которые приходят отCenter.Containerприоритизирует свои собственные размеры, если они заданы.Containerпроверяет, допустимы ли его заданные размеры в рамках полученных констрейнтов. В данном случае, констрейнты отCenter(которые, напомню, не обязуют быть бесконечными, а скорее позволяют быть любыми в пределах экрана) позволяютContainer-у быть 100x100. ПоэтомуContainerи становится размером 100x100.
Почему Container не растягивается на весь экран, как вы ожидали?
Потому что вы явно указали размер Container-а как 100x100. Container в этом случае ведет себя так, как и должен: он берет заданные размеры, проверяет, что они допустимы в рамках констрейнтов, и использует их.
Вот где можно почитать и посмотреть информацию:
Understanding layout constraints: Это ключевой раздел официальной документации. Он фундаментально объясняет, как работают констрейнты во Flutter. Здесь вы найдете ответы на вопросы:
- Что такое констрейнты (constraints)?
- Как констрейнты передаются от родителя к ребёнку?
- Какие типы констрейнтов существуют (минимальная и максимальная ширина/высота)?
- Как виджеты реагируют на констрейнты?
drawFrame: Этот раздел дает общее понимание процесса рендеринга виджетов во Flutter, включая этапы layout, paint и composition. Понимание общего процесса поможет лучше понять место констрейнтов в этом процессе.
Виджет Container: Изучите документацию
Container, обратите внимание на разделы проconstraints,width,heightи как они взаимодействуют.Layout widgets: Раздел документации, посвящённый layout-виджетам. Здесь вы найдете описание различных виджетов для управления расположением и размерами, включая
Center,Container,Row,Column,Expanded,SizedBoxи другие. Понимание различных layout-виджетов поможет вам строить более сложные и гибкие UI.