Sobes.tech
Middle

De ce nu se pot realiza operații de calcul prelungite într-o metodă asincronă?

sobes.tech AI

Răspuns de la AI

Operațiile de calcul prelungite într-o metodă asincronă, executată în izolatorul principal (firul UI), blochează UI-ul. Deși metoda asincronă utilizează Future sau async/await, ea totuși rulează în același fir. În timp ce o sarcină consumatoare de resurse este în curs de execuție, UI-ul nu poate fi actualizat, ceea ce duce la "înghețarea" aplicației.

Pentru a efectua operații lungi fără a bloca UI-ul, trebuie să folosiți:

  • Izolate: Fire de execuție separate care nu împart memoria cu izolatorul principal. Comunicația între izolate se face prin porturi (SendPort, ReceivePort).
  • Funcția Compute: Un wrapper convenabil pentru crearea și gestionarea izolatelor pentru calcule mici.
import 'dart:isolate';
import 'package:flutter/foundation.dart';

// Funcție care efectuează calcule lungi
int performHeavyComputation(int data) {
  // Simulare de calcule lungi
  int result = 0;
  for (int i = 0; i < 1000000000; i++) {
    result += i;
  }
  return result + data;
}

// Utilizarea compute pentru a executa într-un alt izolator
Future<int> heavyComputationInIsolate(int data) async {
  return compute(performHeavyComputation, data);
}

// Exemplu de utilizare într-un StatefulWidget
class MyWidgetState extends State<MyWidget> {
  int computationResult = 0;

  Future<void> _startComputation() async {
    // Apelarea calculelor lungi într-un alt izolator
    computationResult = await heavyComputationInIsolate(10);
    setState(() {
      // Actualizarea UI după obținerea rezultatului
    });
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Text('Rezultatul calculului: $computationResult'),
          ElevatedButton(
            onPressed: _startComputation,
            child: const Text('Începe calculul'),
          ),
        ],
      ),
    );
  }
}