Flutter - Введение в виджеты
Как мы узнали в предыдущей главе, виджеты - это все во фреймворке Flutter. Мы уже узнали, как создавать новые виджеты в предыдущих главах.
В этой главе давайте разберемся с фактической концепцией создания виджетов и различных типов виджетов, доступных во фреймворке Flutter .
Давайте проверим виджет MyHomePage приложения Hello World . Код для этой цели приведен ниже -
class MyHomePage extends StatelessWidget { 
   MyHomePage({Key key, this.title}) : super(key: key); 
   
   final String title; 
   @override 
   Widget build(BuildContext context) {
      return Scaffold( 
         appBar: AppBar(title: Text(this.title), ), 
         body: Center(child: Text( 'Hello World',)),
      );
   }
} 
    Здесь мы создали новый виджет, расширив StatelessWidget .
Обратите внимание, что StatelessWidget требует реализации только одной сборки метода в производном классе. Метод сборки получает контекстную среду, необходимую для создания виджетов, через параметр BuildContext и возвращает создаваемый виджет.
В коде мы использовали title как один из аргументов конструктора, а также использовали Key как другой аргумент. Название используется для отображения названия и ключ используется для идентификации виджета в среде сборки.
Здесь сборки метод вызывает сборки метод строительных лесов , который , в свою очередь , называют сборки метода AppBar и Центра , чтобы построить свой пользовательский интерфейс.
Наконец, метод сборки Center вызывает метод сборки Text .
Для лучшего понимания ниже приведено визуальное представление того же самого -
                Визуализация сборки виджета
Во Flutter виджеты могут быть сгруппированы в несколько категорий в зависимости от их функций, как указано ниже:
- Виджеты для конкретных платформ
 - Виджеты макета
 - Виджеты обслуживания состояния
 - Независимые от платформы / базовые виджеты
 
Обсудим теперь подробно каждую из них.
Виджеты для конкретных платформ
У Flutter есть виджеты, специфичные для конкретной платформы - Android или iOS.
Виджеты для Android разработаны в соответствии с рекомендациями по дизайну материалов для ОС Android. Виджеты, специфичные для Android, называются виджетами материалов .
Специфичные для iOS виджеты разработаны в соответствии с Руководством Apple по человеческому интерфейсу и называются виджетами Купертино .
Вот некоторые из наиболее часто используемых виджетов материалов:
- Scaffold
 - AppBar
 - BottomNavigationBar
 - TabBar
 - TabBarView
 - ListTile
 - RaisedButton
 - FloatingActionButton
 - FlatButton
 - IconButton
 - DropdownButton
 - PopupMenuButton
 - ButtonBar
 - TextField
 - Checkbox
 - Radio
 - Switch
 - Slider
 - Выбор даты и времени
 - SimpleDialog
 - AlertDialog
 
Вот некоторые из наиболее часто используемых виджетов Купертино :
- CupertinoButton
 - CupertinoPicker
 - CupertinoDatePicker
 - CupertinoTimerPicker
 - CupertinoNavigationBar
 - CupertinoTabBar
 - CupertinoTabScaffold
 - CupertinoTabView
 - CupertinoTextField
 - CupertinoDialog
 - CupertinoDialogAction
 - CupertinoFullscreenDialogTransition
 - CupertinoPageScaffold
 - CupertinoPageTransition
 - CupertinoActionSheet
 - CupertinoActivityIndicator
 - CupertinoAlertDialog
 - CupertinoPopupSurface
 - CupertinoSlider
 
Виджеты макета
Во Flutter виджет можно создать, составив один или несколько виджетов. Чтобы объединить несколько виджетов в один виджет, Flutter предоставляет большое количество виджетов с функцией компоновки. Например, дочерний виджет можно центрировать с помощью виджета « Центр» .
Вот некоторые из популярных виджетов макета:
Container- Прямоугольная рамка, украшенная виджетами BoxDecoration с фоном, рамкой и тенью.
Center - Центрируйте его дочерний виджет.
Row - Расположите его детей по горизонтали.
Column - Расположите его дочерние элементы в вертикальном направлении.
Stack - Расположите одно над другим.
Мы подробно проверим виджеты макета в следующей главе « Введение в виджеты макета» .
Виджеты обслуживания состояния
Во Flutter все виджеты являются производными от StatelessWidget или StatefulWidget .
Виджет, производный от StatelessWidget , не имеет никакой информации о состоянии, но может содержать виджет, производный от StatefulWidget . Динамический характер приложения обусловлен интерактивным поведением виджетов и изменением состояния во время взаимодействия. Например, нажатие кнопки счетчика увеличит / уменьшит внутреннее состояние счетчика на единицу, а реактивный характер виджета Flutter автоматически повторно отобразит виджет с использованием новой информации о состоянии.
Мы подробно изучим концепцию виджетов StatefulWidget в следующей главе «Управление состоянием» .
Независимые от платформы / базовые виджеты
Flutter предоставляет большое количество базовых виджетов для создания как простого, так и сложного пользовательского интерфейса независимо от платформы. Давайте посмотрим на некоторые из основных виджетов в этой главе.
Text
Текстовый виджет используется для отображения отрезка строки. Стиль строки может быть установлен с помощью свойства стиля и класса TextStyle . Пример кода для этой цели выглядит следующим образом:
Text('Hello World!', style: TextStyle(fontWeight: FontWeight.bold)) 
    Текстовый виджет имеет специальный конструктор Text.rich , который принимает дочерний элемент типа TextSpan для указания строки с другим стилем. Виджет TextSpan является рекурсивным по своей природе и принимает TextSpan в качестве своих дочерних элементов . Пример кода для этой цели выглядит следующим образом:
Text.rich( 
   TextSpan( 
      children: <TextSpan>[ 
         TextSpan(text: "Hello ", style:  
         TextStyle(fontStyle: FontStyle.italic)),  
         TextSpan(text: "World", style: 
         TextStyle(fontWeight: FontWeight.bold)),  
      ], 
   ), 
) 
    Наиболее важные свойства текстового виджета следующие:
maxLines, int - Максимальное количество строк для отображения
overflow, TextOverFlow- Укажите, как обрабатывается визуальное переполнение с помощью класса TextOverFlow
style, TextStyle- Укажите стиль строки с помощью класса TextStyle
textAlign, TextAlign- Выравнивание текста по правому, левому краю , по ширине и т. Д. С использованием класса TextAlign
textDirection, TextDirection - Направление текста слева направо или справа налево.
Image
Виджет изображения используется для отображения изображения в приложении. Виджет изображений предоставляет различные конструкторы для загрузки изображений из нескольких источников, и они следующие:
Image- Универсальный загрузчик изображений с использованием ImageProvider
Image.asset - Загрузить изображение из ресурсов проекта flutter
Image.file - Загрузить изображение из системной папки
Image.memory - Загрузить изображение из памяти
Image.Network - Загрузить изображение из сети
Самый простой способ загрузить и отобразить изображение во Flutter - это включить изображение в качестве ресурсов приложения и загрузить его в виджет по запросу.
Создайте папку с активами в папке проекта и разместите необходимые изображения.
Укажите активы в pubspec.yaml, как показано ниже -
flutter: 
   assets: 
      - assets/smiley.png 
    Теперь загрузите и отобразите изображение в приложении.
Image.asset('assets/smiley.png') 
    Полный исходный код виджета MyHomePage приложения hello world и результат показаны ниже -.
class MyHomePage extends StatelessWidget {
   MyHomePage({Key key, this.title}) : super(key: key); 
   final String title; 
   @override 
   Widget build(BuildContext context) {
      return Scaffold( 
         appBar: AppBar( title: Text(this.title), ), 
         body: Center( child: Image.asset("assets/smiley.png")),
      ); 
   }
} 
    Загруженное изображение показано ниже -
                Наиболее важные свойства виджета Image следующие:
image, ImageProvider - Фактическое изображение для загрузки
width, double - Ширина изображения
height, double - Высота изображения
alignment, AlignmentGeometry - Как выровнять изображение в пределах его границ
Icon
Виджет « Значок» используется для отображения глифа из шрифта, описанного в классе IconData . Код для загрузки простого значка электронной почты выглядит следующим образом:
Icon(Icons.email) 
    Полный исходный код для его применения в приложении hello world выглядит следующим образом:
class MyHomePage extends StatelessWidget { 
   MyHomePage({Key key, this.title}) : super(key: key); 
   final String title; 
   @override 
   Widget build(BuildContext context) {
      return Scaffold(
         appBar: AppBar(title: Text(this.title),),
         body: Center( child: Icon(Icons.email)),
      );
   }
} 
    Значок загружен, как показано ниже -