Sobes.tech
Middle+

Ką žinote apie Flutter vidinę struktūrą?

sobes.tech AI

Atsakymas iš AI

„Flutter“ branduolį sudaro variklis, rėmas ir valdikliai.

  • „Flutter“ variklis: Parašytas C++ ir teikia žemyninio lygio API, skirtą atvaizdavimui, teksto apdorojimui, srautams ir papildiniams. Jis tiesiogiai sąveikauja su platforma (iOS, Android, Web, Desktop) ir grafikos API (pvz., Skia). Variklis valdo atvaizdavimą, asinchroninius veiksmus ir programos gyvavimo ciklą.

  • „Flutter“ rėmas (Framework): Parašytas Dart ir teikia abstrakcijos sluoksnį virš variklio. Jame yra daugybė paruoštų komponentų:

    • Foundation: Pagrindiniai klasės ir pagalbinės funkcijos.
    • Rendering: Sluoksnis, kuris valdo atvaizdų medį ir jų piešimą.
    • Widgets: Pagrindiniai UI statybiniai blokai, kurie sudaro widget medį.
    • Material Design ir Cupertino: Widget rinkiniai, įgyvendinantys Material Design stilių ir iOS dizainą.
  • Valdikliai: „Flutter“ viskas yra valdiklis. Valdikliai apibūdina UI konfigūraciją. Yra du pagrindiniai tipai:

    • StatelessWidget: Valdiklis be vidinės keičiančios būsenos. Jo UI priklauso tik nuo įėjimo parametrų (properties).
    • StatefulWidget: Valdiklis, kuris gali turėti keičiamą būseną. Jis susideda iš paties valdiklio ir State objekto, kuriame saugoma būseną ir UI kūrimo logiką (build metodas).

Atvaizdavimo procesas:

  1. Build: Rėmas iškviečia valdiklio build() metodą, kuris grąžina kitų valdiklių medį.
  2. Element Tree: Remiantis valdiklių medžiu, sukuriamas elementų medis (Element Tree), kuris atstovauja UI struktūrą. Elementai sujungia valdiklius su atitinkamais atvaizdavimo objektais.
  3. Render Object Tree: Elementai kuria ir valdo atvaizdavimo objektų medį (Render Object Tree). Atvaizdavimo objektai atsakingi už maketavimą, dažymą ir hit testing.
  4. Painting: Variklis naudoja Skia (mobiliose ir darbalaukio platformose) arba CanvasKit (internete) atvaizduoti Render Objects ekrane.

Reaktyvus programavimas:

„Flutter“ naudoja reaktyvų požiūrį į UI kūrimą. Kai keičiasi programos būseną, rėmas atnaujina tą dalį valdiklių medžio, kuri priklauso nuo šios būsenos. Tai vyksta automatiškai ir efektyviai, naudojant diffing mechanizmą ir greitą valdiklių kūrimą bei naikinimą.

Karšto perkrovimo (Hot Reload) ir karšto perkrovimo (Hot Restart):

  • Hot Reload: įterpia atnaujintą Dart kodą į paleistą programą be būsenos praradimo. Idealiai tinka greitam UI iteravimui.
  • Hot Restart: iš naujo paleidžia programą su atnaujintu kodu ir iš naujo nustatyta būsena. Naudojama, kai Hot Reload neveikia, pvz., keičiant initState ar globalius kintamuosius.

Platformos specifinis kodas:

„Flutter“ leidžia sąveikauti su natūraliais platformos API per platforminius kanalus (Platform Channels). Tai leidžia iškviesti natūralaus kodo metodus (Java/Kotlin Android, Swift/Objective-C iOS) ir gauti rezultatus atgal į Dart.

// Pavyzdys naudojant platformos kanalą
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 = 'Baterijos lygis: $result %.';
  } on PlatformException catch (e) {
    batteryLevel = "Nepavyko gauti baterijos lygio: '${e.message}'.";
  }
  // UI atnaujinimas
}