Sobes.tech
Middle

Prečo nie je možné vykonávať dlhé výpočtové operácie v asynchrónnej metóde?

sobes.tech AI

Odpoveď od AI

Dlhé výpočtové operácie v asynchrónnej metóde, ktorá sa vykonáva v hlavnom izoláte (UI vlákne), blokujú UI. Hoci asynchrónna metóda používa Future alebo async/await, stále sa vykonáva v tom istom vlákne. Kým sa vykonáva náročná úloha, UI sa nemôže aktualizovať, čo spôsobuje "zamrznutie" aplikácie.

Na vykonávanie dlhých operácií bez blokovania UI je potrebné použiť:

  • Izoláty: Samostatné vlákna vykonávania, ktoré nezdieľajú pamäť s hlavným izolátom. Komunikácia medzi izolátmi prebieha cez porty (SendPort, ReceivePort).
  • Funkcia Compute: Praktický obal na vytváranie a správu izolátov pre malé výpočty.
import 'dart:isolate';
import 'package:flutter/foundation.dart';

// Funkcia, ktorá vykonáva dlhé výpočty
int performHeavyComputation(int data) {
  // Simulácia dlhých výpočtov
  int result = 0;
  for (int i = 0; i < 1000000000; i++) {
    result += i;
  }
  return result + data;
}

// Použitie compute na vykonanie v inom izoláte
Future<int> heavyComputationInIsolate(int data) async {
  return compute(performHeavyComputation, data);
}

// Príklad použitia v StatefulWidget
class MyWidgetState extends State<MyWidget> {
  int computationResult = 0;

  Future<void> _startComputation() async {
    // Volanie dlhých výpočtov v inom izoláte
    computationResult = await heavyComputationInIsolate(10);
    setState(() {
      // Aktualizácia UI po získaní výsledku
    });
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Text('Výsledok výpočtu: $computationResult'),
          ElevatedButton(
            onPressed: _startComputation,
            child: const Text('Spustiť výpočet'),
          ),
        ],
      ),
    );
  }
}