Введение в виджеты

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

Flutter отличается от других фреймворков тем, что его пользовательский интерфейс встроен в код, а не (например) в файл XML или что-то подобное. Виджеты — это основные строительные блоки пользовательского интерфейса Flutter. По мере прохождения этой кодовой лаборатории вы узнаете, что почти все во Flutter — это виджеты. Виджет — это неизменяемый объект, описывающий определенную часть пользовательского интерфейса. Вы также узнаете, что виджеты Flutter являются составными, что означает, что вы можете комбинировать существующие виджеты для создания более сложных виджетов.

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

Hello World

Минимальное приложение Flutter просто вызывает runApp() функцию с виджетом:

Функция runApp()берет данное Widgetи делает его корнем дерева виджетов. В этом примере дерево виджетов состоит из двух виджетов, самого Centerвиджета и его дочернего элемента, Textвиджета. Фреймворк заставляет корневой виджет закрывать экран, что означает, что текст «Hello, world» оказывается по центру экрана. В этом случае необходимо указать направление текста; когда MaterialAppвиджет используется, об этом позаботятся, как показано ниже.

При написании приложения вы обычно создаете новые виджеты, которые являются подклассами либо , StatelessWidgetлибо StatefulWidget, в зависимости от того, управляет ли ваш виджет каким-либо состоянием. Основная задача виджета — реализовать build()функцию, которая описывает виджет с точки зрения других виджетов более низкого уровня. Фреймворк строит эти виджеты по очереди, пока процесс не достигнет нижнего предела в виджетах, представляющих базовый элемент RenderObject, который вычисляет и описывает геометрию виджета.

Основные виджеты

Flutter поставляется с набором мощных базовых виджетов, из которых обычно используются следующие:

TextВиджет Textпозволяет вам создать серию стилизованного текста в вашем приложении.

Row,ColumnЭти гибкие виджеты позволяют создавать гибкие макеты как в горизонтальном ( Row), так и в вертикальном ( Column) направлениях. Дизайн этих объектов основан на веб-модели компоновки flexbox.

StackВместо линейной ориентации (горизонтальной или вертикальной) Stackвиджет позволяет размещать виджеты друг над другом в порядке рисования. Затем вы можете использовать Positionedвиджет для дочерних элементов, Stackчтобы расположить их относительно верхнего, правого, нижнего или левого края стека. Стеки основаны на модели макета абсолютного позиционирования в Интернете.

ContainerВиджет Containerпозволяет создать прямоугольный визуальный элемент. Контейнер можно украсить BoxDecoration, например фоном, рамкой или тенью. A Containerтакже может иметь поля, отступы и ограничения, применяемые к его размеру. Кроме того, а Containerможно преобразовать в трехмерное пространство с помощью матрицы.

Ниже приведены несколько простых виджетов, объединяющих эти и другие виджеты:

Добавлены виджеты: AppBar, IconButton

Многие виджеты Material Design должны быть внутри MaterialApp для правильного отображения, чтобы наследовать данные темы. Поэтому запускайте приложение с расширением MaterialApp.

Примечание. Материал — это один из двух дизайнов, поставляемых вместе с Flutter. Чтобы создать дизайн, ориентированный на iOS, см. пакет компонентов из Купертино , в котором есть собственные версии CupertinoApp, и CupertinoNavigationBar.

Обработка жестов

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

Виджет GestureDetectorне имеет визуального представления, но вместо этого обнаруживает жесты, сделанные пользователем. Когда пользователь нажимает Container, GestureDetectorвызывается onTap()обратный вызов, в данном случае вывод сообщения на консоль. Вы можете использовать GestureDetectorдля обнаружения различных жестов ввода, включая нажатия, перетаскивания и масштабирования.

Изменение виджетов в ответ на ввод

Чтобы создать более сложный опыт — например, более интересно реагировать на пользовательский ввод — приложения обычно содержат некоторое состояние. Flutter использует StatefulWidgets, чтобы уловить эту идею. StatefulWidgets— это специальные виджеты, умеющие генерировать Stateобъекты, которые затем используются для хранения состояния. Рассмотрим этот базовый пример, используя ElevatedButtonупомянутое ранее:

При нажатии на кнопку инкремент увеличивает число на 1

Объединяя все это

Далее следует более полный пример, объединяющий эти концепции: гипотетическое приложение для покупок отображает различные продукты, предлагаемые для продажи, и поддерживает корзину покупок для предполагаемых покупок. Начните с определения класса представления ShoppingListItem:

Виджет ShoppingListItemследует общему шаблону для виджетов без состояния. Он сохраняет значения, полученные в своем конструкторе, в finalпеременных-членах, которые затем использует во время своей build()функции. Например, inCartлогическое значение позволяет переключаться между двумя визуальными представлениями: одно использует основной цвет из текущей темы, а другое — серый.

Вот пример родительского виджета, в котором хранится изменяемое состояние:

Класс ShoppingListextends StatefulWidgetозначает, что этот виджет хранит изменяемое состояние. Когда ShoppingListвиджет впервые вставляется в дерево, платформа вызывает createState()функцию для создания нового экземпляра _ShoppingListStateдля связи с этим местоположением в дереве. (Обратите внимание, что подклассы Stateобычно имеют начальные символы подчеркивания, чтобы указать, что они являются частными деталями реализации.) Когда родитель этого виджета перестраивается, родитель создает новый экземпляр ShoppingList, но инфраструктура повторно использует _ShoppingListState экземпляр, который уже находится в дереве, а не вызывает createStateснова.

Реагирование на события жизненного цикла виджета

После вызова createState()фреймворк StatefulWidgetвставляет новый объект состояния в дерево, а затем вызывает initState()объект состояния. Подкласс Stateможет переопределить initStateдля выполнения работы, которая должна произойти только один раз. Например, переопределите initState настройку анимации или подписку на службы платформы. Реализации initStateдолжны начинаться с вызова super.initState.

Когда объект состояния больше не нужен, платформа вызывает dispose()объект состояния. Переопределите disposeфункцию, чтобы выполнить очистку. Например, переопределить, disposeчтобы отменить таймеры или отказаться от подписки на службы платформы. Реализации disposeобычно заканчиваются вызовом super.dispose.

Для получения дополнительной информации см State.

Last updated