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

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

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

Hello World

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

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

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

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

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

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

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

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

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

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

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

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

circle-info

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Last updated