Middle
Pourquoi ne peut-on pas effectuer de longues opérations de calcul dans une méthode asynchrone?
sobes.tech IA
Réponse de l'IA
Les opérations de calcul prolongées dans une méthode asynchrone exécutée dans l'isolat principal (fil d'UI) bloquent l'UI. Bien que la méthode asynchrone utilise Future ou async/await, elle s'exécute toujours dans le même fil. Pendant qu'une tâche gourmande en ressources est en cours, l'UI ne peut pas se mettre à jour, ce qui entraîne le gel de l'application.
Pour effectuer des opérations longues sans bloquer l'UI, il faut utiliser :
- Isolats : Des fils d'exécution séparés qui ne partagent pas la mémoire avec l'isolat principal. La communication entre isolats se fait via des ports (SendPort, ReceivePort).
- Fonction Compute : Un wrapper pratique pour créer et gérer des isolats pour de petits calculs.
import 'dart:isolate';
import 'package:flutter/foundation.dart';
// Fonction effectuant des calculs longs
int performHeavyComputation(int data) {
// Simulation de calculs longs
int result = 0;
for (int i = 0; i < 1000000000; i++) {
result += i;
}
return result + data;
}
// Utilisation de compute pour exécuter dans un autre isolat
Future<int> heavyComputationInIsolate(int data) async {
return compute(performHeavyComputation, data);
}
// Exemple d'utilisation dans un StatefulWidget
class MyWidgetState extends State<MyWidget> {
int computationResult = 0;
Future<void> _startComputation() async {
// Appel de calculs longs dans un autre isolat
computationResult = await heavyComputationInIsolate(10);
setState(() {
// Mise à jour de l'UI après obtention du résultat
});
}
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Résultat des calculs : $computationResult'),
ElevatedButton(
onPressed: _startComputation,
child: const Text('Commencer le calcul'),
),
],
),
);
}
}