Co víte o vnitřní struktuře Flutteru?
sobes.tech AI
Odpověď od AI
Jádro Flutteru se skládá z jádra, rámce a widgetů.
-
Motor Flutter: Napsaný v C++ a poskytuje nízkoúrovňové API pro vykreslování, práci s textem, vlákny a pluginy. Přímo komunikuje s platformou (iOS, Android, Web, Desktop) a grafickými API (například Skia). Motor řídí vykreslování, asynchronní operace a životní cyklus aplikace.
-
Rámec Flutter (Framework): Napsaný v Dart a poskytuje vrstvu abstrakce nad motorem. Obsahuje mnoho hotových komponent:
- Foundation: Základní třídy a pomocné funkce.
- Rendering: Vrstva pro správu stromu renderovacích objektů a jejich vykreslování.
- Widgets: Hlavní stavební bloky UI, které tvoří strom widgetů.
- Material Design a Cupertino: Sady widgetů implementujících styly Material Design a iOS design.
-
Widgety: Ve Flutteru je vše widget. Popisují konfiguraci UI. Existují dva hlavní typy:
- StatelessWidget: Widget bez vnitřního měnitelného stavu. Jeho UI závisí pouze na jeho vstupních parametrech (
properties). - StatefulWidget: Widget, který může mít měnitelný stav. Skládá se z widgetu a objektu
State, ve kterém je uložen stav a logika tvorby UI (buildmetoda).
- StatelessWidget: Widget bez vnitřního měnitelného stavu. Jeho UI závisí pouze na jeho vstupních parametrech (
Proces vykreslování:
- Build: Framework volá metodu
build()widgetu, která vrací strom dalších widgetů. - Element Tree: Na základě stromu widgetů je vytvořen strom elementů (
Element Tree), který představuje strukturu UI. Elementy spojují widgety s odpovídajícími objekty renderování. - Render Object Tree: Elementy vytvářejí a spravují strom renderovacích objektů (
Render Object Tree). Objekt renderování je odpovědný za rozložení, barvení a hit testing. - Painting: Motor používá Skia (na mobilu a desktopu) nebo CanvasKit (na webu) k vykreslení Render Objectů na obrazovku.
Reaktivní programování:
Flutter používá reaktivní přístup k tvorbě UI. Při změně stavu aplikace framework přestavuje tu část stromu widgetů, která na tento stav závisí. To se děje automaticky a efektivně díky mechanismu diffing a rychlému vytváření a ničení widgetů.
Horké načítání (Hot Reload) a Horké restartování (Hot Restart):
- Hot Reload: Vkládá aktualizovaný Dart kód do běžící aplikace bez ztráty stavu. Ideální pro rychlou iteraci UI.
- Hot Restart: Restartuje aplikaci od začátku s aktualizovaným kódem a resetovaným stavem. Používá se, když Hot Reload nefunguje, například při změnách v
initStatenebo globálních proměnných.
Kód specifický pro platformu:
Flutter umožňuje komunikaci s nativními API platformy přes platformní kanály (Platform Channels). To umožňuje volání metod nativního kódu (Java/Kotlin na Androidu, Swift/Objective-C na iOS) a získávání výsledků zpět do Dart.
// Příklad použití platformního kanálu
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 = 'Úroveň baterie: $result %.';
} on PlatformException catch (e) {
batteryLevel = "Nepodařilo se získat úroveň nabití: '${e.message}'.";
}
// Aktualizace UI
}