Sobes.tech
Middle

Waarom kunnen langdurige rekenkundige bewerkingen niet worden uitgevoerd in een asynchrone methode?

sobes.tech AI

Antwoord van AI

Lange rekentaken in een asynchrone methode die wordt uitgevoerd in de hoofdisolaat (UI-thread) blokkeren de UI. Hoewel de asynchrone methode Future of async/await gebruikt, wordt deze nog steeds in hetzelfde thread uitgevoerd. Terwijl een resource-intensieve taak wordt uitgevoerd, kan de UI niet worden bijgewerkt, wat leidt tot het 'vastlopen' van de applicatie.

Om lange operaties uit te voeren zonder de UI te blokkeren, moet je gebruiken:

  • Isolaten: Aparte uitvoeringsstromen die geen geheugen delen met de hoofdisolaat. Communicatie tussen isolaten gebeurt via poorten (SendPort, ReceivePort).
  • Compute-functie: Een handige wrapper voor het maken en beheren van isolaten voor kleine berekeningen.
import 'dart:isolate';
import 'package:flutter/foundation.dart';

// Functie die lange berekeningen uitvoert
int performHeavyComputation(int data) {
  // Simulatie van lange berekeningen
  int result = 0;
  for (int i = 0; i < 1000000000; i++) {
    result += i;
  }
  return result + data;
}

// Gebruik van compute om uit te voeren in een andere isolaat
Future<int> heavyComputationInIsolate(int data) async {
  return compute(performHeavyComputation, data);
}

// Voorbeeld van gebruik in een StatefulWidget
class MyWidgetState extends State<MyWidget> {
  int computationResult = 0;

  Future<void> _startComputation() async {
    // Aanroep van lange berekeningen in een andere isolaat
    computationResult = await heavyComputationInIsolate(10);
    setState(() {
      // UI bijwerken na het verkrijgen van het resultaat
    });
  }

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