Sobes.tech
Middle+

Mida teate Flutteri sisemisest struktuurist?

sobes.tech AI

Vastus AI-lt

„Flutter“ tuum koosneb mootorist, raamistikust ja vidinägidest.

  • „Flutter“ mootor: Kirjutatud C++-s ning pakub madala taseme API-d joonistamiseks, teksti töötlemiseks, voogude ja pistikprogrammide jaoks. See suhtleb otse platvormiga (iOS, Android, Web, Desktop) ning graafikaarhitektuuridega (näiteks Skia). Mootor juhib joonistamist, asünkroonseid operatsioone ja rakenduse elutsüklit.

  • „Flutter“ raamistik (Framework): Kirjutatud Dartis ning pakub abstraktsioonikihi mootorile. See sisaldab mitmeid valmis komponente:

    • Foundation: Põhiklassid ja abifunktsioonid.
    • Rendering: Kiht, mis juhib joonistuspuid ja nende joonistamist.
    • Widgets: UI põhiehituskivid, mis moodustavad vidinapuu.
    • Material Design ja Cupertino: Vidinakomplektid, mis rakendavad Material Designi stiile ja iOS-i disaini.
  • Vidinad: Flutteris on kõik vidinad. Vidinad kirjeldavad UI konfiguratsiooni. On kaks peamist tüüpi:

    • StatelessWidget: Vidin ilma sisemise muutuvate olekuteta. Selle UI sõltub ainult sisendparameetritest (properties).
    • StatefulWidget: Vidin, millel võib olla muutuv olek. See koosneb vidinast ja State-objektist, kus hoitakse olekut ja UI loomise loogikat (build meetod).

Joonistamisprotsess:

  1. Build: Raam kutsub välja vidina build() meetodi, mis tagastab teisi vidinaid.
  2. Element Tree: Vidinate puu põhjal luuakse elementide puu (Element Tree), mis esindab UI struktuuri. Elementid ühendavad vidinad vastavate joonistusobjektidega.
  3. Render Object Tree: Elementid loovad ja juhivad joonistusobjektide puit (Render Object Tree). Joonistusobjektid vastutavad paigutuse, värvimise ja hit testimise eest.
  4. Painting: Mootor kasutab Skia-d (mobiil- ja töölauaplatvormidel) või CanvasKit-i (veebis) Render Objects'i joonistamiseks ekraanile.

Reaktiivne programmeerimine:

Flutter kasutab reaktiivset lähenemist UI loomisel. Kui rakenduse olek muutub, uuendab raam see osa vidinate puust, mis sõltub sellest olekust. See toimub automaatselt ja tõhusalt diffing-mehhanismi ning kiire vidinate loomise ja hävitamise kaudu.

Kohaliku uuesti laadimise (Hot Reload) ja kiire taaskäivitamise (Hot Restart):

  • Hot Reload: sisestab uuendatud Dart-koodi juba jooksvale rakendusele ilma olekut kaotamata. Ideaalne kiire UI iteratsiooni jaoks.
  • Hot Restart: taaskäivitab rakenduse nullist, uuendatud koodiga ja lähtestatud olekuga. Kasutatakse, kui Hot Reload ei tööta, näiteks initState-i või globaalsete muutujate muutmisel.

Platvormispetsiifiline kood:

Flutter võimaldab suhelda platvormi natiivsete API-dega platvormikanalite (Platform Channels) kaudu. See võimaldab kutsuda natiivkoodi meetodeid (Java/Kotlin Androidis, Swift/Objective-C iOS-is) ning saada tulemusi tagasi Dartisse.

// Näide platvormikanali kasutamisest
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 = 'Aku tase: $result %.';
  } on PlatformException catch (e) {
    batteryLevel = "Ei õnnestunud aku taset saada: '${e.message}'.";
  }
  // UI uuendamine
}