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 (buildmeetod).
- StatelessWidget: Vidin ilma sisemise muutuvate olekuteta. Selle UI sõltub ainult sisendparameetritest (
Joonistamisprotsess:
- Build: Raam kutsub välja vidina
build()meetodi, mis tagastab teisi vidinaid. - Element Tree: Vidinate puu põhjal luuakse elementide puu (
Element Tree), mis esindab UI struktuuri. Elementid ühendavad vidinad vastavate joonistusobjektidega. - Render Object Tree: Elementid loovad ja juhivad joonistusobjektide puit (
Render Object Tree). Joonistusobjektid vastutavad paigutuse, värvimise ja hit testimise eest. - 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
}