Что ты знаешь о внутреннем устройстве Flutter?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Ядро Flutter состоит из движка, каркаса и виджетов.
-
Движок Flutter: Написан на C++ и предоставляет низкоуровневый API для рендеринга, работы с текстом, потоками и плагинами. Он взаимодействует непосредственно с платформой (iOS, Android, Web, Desktop) и графическими API (например, Skia). Движок управляет отрисовкой, асинхронными операциями и жизненным циклом приложения.
-
Каркас Flutter (Framework): Написан на Dart и предоставляет слой абстракции над движком. Он включает в себя множество готовых компонентов:
- Foundation: Базовые классы и вспомогательные функции.
- Rendering: Слой для управления деревом объектов рендеринга и их отрисовкой.
- Widgets: Основные строительные блоки UI, которые формируют дерево виджетов.
- Material Design и Cupertino: Наборы виджетов, реализующих стили Material Design и дизайн в стиле iOS.
-
Виджеты: В Flutter всё является виджетом. Виджеты описывают конфигурацию UI. Существуют два основных типа:
- StatelessWidget: Виджет без внутреннего изменяемого состояния. Его UI зависит только от его входных параметров (
properties). - StatefulWidget: Виджет, который может иметь изменяемое состояние. Он состоит из самого виджета и объекта
State, в котором хранится состояние и логика построения UI (buildметод).
- StatelessWidget: Виджет без внутреннего изменяемого состояния. Его UI зависит только от его входных параметров (
Процесс рендеринга:
- Build: Фреймворк вызывает метод
build()виджета, который возвращает дерево других виджетов. - Element Tree: На основе дерева виджетов создается дерево элементов (
Element Tree), которое представляет структуру UI. Элементы связывают виджеты с соответствующими объектами рендеринга. - Render Object Tree: Элементы создают и управляют деревом объектов рендеринга (
Render Object Tree). Объекты рендеринга отвечают за макет, покраску и hit testing. - Painting: Движок использует Skia (на мобильных и десктопе) или CanvasKit (в вебе) для отрисовки Render Objects на экране.
Reactive Programming:
Flutter использует реактивный подход к построению UI. При изменении состояния приложения фреймворк перестраивает ту часть дерева виджетов, которая зависит от этого состояния. Это происходит автоматически и эффективно благодаря механизму diffing и быстрому созданию и уничтожению виджетов.
Горячая перезагрузка (Hot Reload) и Горячий перезапуск (Hot Restart):
- Hot Reload: Вставляет обновленный код Dart в запущенное приложение без потери состояния. Идеально для быстрой итерации UI.
- Hot Restart: Перезапускает приложение с нуля, с обновленным кодом и сброшенным состоянием. Используется, когда Hot Reload не работает, например, при изменениях в
initStateили глобальных переменных.
Платформо-специфичный код:
Flutter позволяет взаимодействовать с нативными API платформы через платформенные каналы (Platform Channels). Это позволяет вызывать методы нативного кода (Java/Kotlin на Android, Swift/Objective-C на iOS) и получать результаты обратно в Dart.
// Пример использования Platform Channel
import 'package:flutter/services.dart';
static const platform = MethodChannel('samples.flutter.dev/battery');
Future<void> getBatteryLevel() async {
String batteryLevel;
try {
final int result = await platform.invokeMethod('getBatteryLevel');
batteryLevel = 'Уровень заряда батареи: $result %.';
} on PlatformException catch (e) {
batteryLevel = "Не удалось получить уровень заряда: '${e.message}'.";
}
// Обновление UI
}