Sobes.tech
Middle

Niyə asinxron metodda uzun müddətli hesablamalar aparmaq olmaz?

sobes.tech Süni İntellekt

AI-dan cavab

Uzun hesablama əməliyyatları əsas izolyatda (UI ipində) icra olunan asinxron metodda UI-ni bloklayır. Hətta Future və ya async/await istifadə etsə də, metod hələ də eyni ipdə icra olunur. Resurs tələbatlı tapşırıq yerinə yetirilərkən, UI yenilənə bilməz və bu, tətbiqin donmasına səbəb olur.

UI-ni bloklamadan uzun əməliyyatları yerinə yetirmək üçün aşağıdakı istifadə olunmalıdır:

  • İzolalar: Əsas izolyat ilə paylaşmayan ayrıca icra axınları. İzolalar arasında əlaqə portlar (SendPort, ReceivePort) vasitəsilə həyata keçirilir.
  • Compute funksiyası: Kiçik hesablamalar üçün izolalar yaratmaq və idarə etmək üçün rahat bir qabıq.
import 'dart:isolate';
import 'package:flutter/foundation.dart';

// Uzun hesablama əməliyyatları edən funksiya
int performHeavyComputation(int data) {
  // Uzun hesablama simulyasiyası
  int result = 0;
  for (int i = 0; i < 1000000000; i++) {
    result += i;
  }
  return result + data;
}

// compute istifadə edərək başqa izolatda icra
Future<int> heavyComputationInIsolate(int data) async {
  return compute(performHeavyComputation, data);
}

// StatefulWidget-də nümunə istifadəsi
class MyWidgetState extends State<MyWidget> {
  int computationResult = 0;

  Future<void> _startComputation() async {
    // Uzun hesablama əməliyyatlarını başqa izolatda çağır
    computationResult = await heavyComputationInIsolate(10);
    setState(() {
      // Nəticəni əldə etdikdən sonra UI-ni yenilə
    });
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Text('Hesablama nəticəsi: $computationResult'),
          ElevatedButton(
            onPressed: _startComputation,
            child: const Text('Hesablama başlat'),
          ),
        ],
      ),
    );
  }
}