Sobes.tech
Middle

Koks yra programų vykdymo modelis Flutter'yje?

sobes.tech AI

Atsakymas iš AI

Flutter naudoja vieno siūlo vykdymo modelį naudotojo sąsajai.

Pagrindinės vykdymo modelio sudedamosios dalys:

  • UI Thread (arba Isolate): Pagrindinė gija, kur vykdomas visas Dart kodas, kuriami valdikliai, apdorojami gestai ir vyksta atvaizdavimas.
  • Platform Channel: Mechanizmas, skirtas Dart kodo sąveikai su platformos natyviniais API (Android/iOS). Duomenų mainai vyksta asinchroniškai.
  • Event Loop: Renginio ciklas UI gijoje. Jis apdoroja:
    • Vartotojo įvestį.
    • Laikmačius.
    • Asinchroninių operacijų rezultatus (pvz., tinklo užklausas).
    • Atvaizdavimo įvykius.
  • Async/Await: Dart kalbos konstrukcijos, skirtos neblokiruojančioms operacijoms. Jos leidžia vykdyti ilgalaikes užduotis, neįstrigant UI gijos.
  • Isolates: Nepriklausomos darbo vienetai, kurie gali vykdyti Dart kodą paraleliai su UI gija. Jie naudojami atlikti sudėtingus skaičiavimus, kad UI nebūtų užblokuotas. Jie tiesiogiai ne dalijasi atmintimi su UI gija; sąveika vyksta per žinutes (prievadus).

Pavyzdys naudojant async/await neblokiruojančiai operacijai:

Future<String> fetchData() async {
  // Ilgalaikės operacijos imitacija, pvz., tinklo užklausa
  await Future.delayed(Duration(seconds: 2));
  return 'Duomenys gauti!';
}

void main() async {
  print('Pradžia vykdymo...');
  String result = await fetchData(); // Laukiama fetchData pabaigos
  print(result);
  print('Vykdymo pabaiga.');
}

Pavyzdys naudojant Isolate sudėtingam skaičiavimui:

import 'dart:isolate';

// Funkcija, vykdoma naujame Isolate
int heavyComputation(int value) {
  int result = 0;
  for (int i = 0; i < value; i++) {
    result += i;
  }
  return result;
}

void main() async {
  print('Pagrindinė gija: Pradedami sudėtingi skaičiavimai...');

  // Prievado sukūrimas žinučių mainams
  ReceivePort receivePort = ReceivePort();

  // Naujo Isolate sukūrimas ir funkcijos bei siuntimo prievado perdavimas
  await Isolate.spawn(heavyComputationWrapper, [1000000000, receivePort.sendPort]);

  // Laukiama žinutės
  int result = await receivePort.first;

  print('Pagrindinė gija: Gauta rezultatas - $result');
}

// Pagalbinė funkcija argumentų perdavimui į Isolate funkciją
void heavyComputationWrapper(List<dynamic> args) {
  int value = args[0];
  SendPort sendPort = args[1];
  int result = heavyComputation(value);
  sendPort.send(result); // Rezultato siuntimas atgal į pagrindinę giją
}

Flutter vykdymo modelis sukurtas užtikrinti sklandų 60 FPS (arba 120 FPS, jei palaikoma) atvaizdavimą, išvengiant "užstrigimų" UI, nes dauguma operacijų vykdomos UI gijoje, naudojant asinchroninius mechanizmus ir Isolates sudėtingiems uždaviniams.