Sobes.tech
Middle

Чӣ гуна ду сӯзишвориро дар Dart дар контексти Flutter эҷод кардан мумкин аст?

sobes.tech AI

Ҷавоб аз AI

Дарти/Флаттерда мустақил иҷрои ҷараёнҳоро (Isolates) истифода мебаранд. Онҳо вазифаҳои алоҳида бо ҷойи хотираи худ доранд, ки мушкилоти дастрасии рақобатпазир ба маълумот ва бастани ҷараёни асосӣ (UI)-ро пешгирӣ мекунад.

Барои сохтани ва муошират бо isolates чанд роҳ мавҷуд аст:

  1. Isolate.spawn(): роҳи пасттарин барои сохтани isolate. Он талаб мекунад, ки функсияи сатҳи боло ё усули статикӣ барои иҷро дар isolate нав ва порт барои мубодилаи паёмҳо дода шавад.

    import 'dart:isolate';
    
    // Функсия, ки дар isolate иҷро мешавад
    void isolateEntry(SendPort sendPort) {
      // Як амали дарозро иҷро мекунем
      int result = 0;
      for (int i = 0; i < 1000000000; i++) {
        result += i;
      }
      // Натиҷаро ба isolate асосӣ мефиристем
      sendPort.send(result);
    }
    
    void main() async {
      ReceivePort receivePort = ReceivePort();
      // Созишномаи isolate нав
      Isolate isolate = await Isolate.spawn(isolateEntry, receivePort.sendPort);
    
      // Гӯш кардани паёмҳо аз isolate
      receivePort.listen((message) {
        print('Натиҷа аз isolate: $message');
        // Идома додан ба isolate пас аз гирифтани паём
        isolate.kill();
      });
    
      print('Ҷараёни асосӣ идома дорад...');
    }
    
  2. compute(): функсияи соддашуда аз бастаи flutter/foundation, ки Isolate.spawn()-ро дар пасзамина истифода мебарад. Барои вазифаҳои оддӣ дар пасзамина, ки ниёз ба муоширати мураккаб бо isolate надоранд, комил аст.

    import 'package:flutter/foundation.dart';
    
    // Функсия, ки бо истифодаи compute иҷро мешавад
    int heavyComputation(int limit) {
      int result = 0;
      for (int i = 0; i < limit; i++) {
        result += i;
      }
      return result;
    }
    
    void main() async {
      print('Ҳамонро дар пасзамина оғоз мекунем...');
      // Иҷрои функсия дар isolate ҷудогона
      int result = await compute(heavyComputation, 1000000000);
      print('Натиҷаи ҳисобҳо: $result');
      print('Ҷараёни асосӣ пас аз ҳисобҳо идома дорад.');
    }
    
  3. Isolate.spawnUri(): Барои оғоз кардани коди аз файли ҷудогонаи dart дар isolate нав истифода мешавад.

Муошират байни isolates:

Изолятҳо маълумотро танҳо тавассути паёмҳо тавассути нусхаҳои SendPort ва ReceivePort мубодила мекунанд. Ин амалиётҳо атомӣ мебошанд ва ниёз ба бастан ё механизмҳои дигар барои ҳамоҳангсозӣ надоранд.

  • SendPort: барои фиристодани паёмҳо аз як isolate ба дигар истифода мешавад.
  • ReceivePort: барои гӯш кардани паёмҳои дохилӣ истифода мешавад.

Ҳангоми интиқоли объектҳо байни isolates, онҳо бояд "таслимшаванда" (transferable) бошанд, ки инҳоро дар бар мегирад:

  • Типҳои соддаи маълумот (int, double, String, bool)
  • Листҳо ва харитҳо, ки дар онҳо типҳои таслимшаванда ҳастанд
  • Нақшҳои махсуси Flutter, ки метавонанд сериализатсия шаванд

Объектҳое, ки таслимшаванда нестанд, нусхабардорӣ мешаванд ва тағиротҳои минбаъда дар яке аз isolates ба дигар таъсир намерасонанд.

Мавзӯъҳои асосӣ:

  • isolates наметавонанд мустақиман ба хотираи якдигар дастрасӣ дошта бошанд.
  • Онҳо ба ҳолати умумӣ, аз ҷумла тағйирёбандаҳо, синфҳо ва widget-ҳои isolate асосӣ (UI) дастрасӣ надоранд.
  • Муошират байни isolates ба таври асинхрон сурат мегирад.
  • Дар Flutter, муҳим аст, ки ҳаёти isolates-ро дуруст идора кунед (масалан, бо истифода аз isolate.kill() агар лозим бошад).

Истифодаи isolates имкон медиҳад, ки амалиётҳои дарозмуддат ё сарватманд дар пасзамина иҷро шаванд, ки ба қатъ шудани интерфейси корбар пешгирӣ мекунад ва кори барнома ба таври ҳамвор таъмин мешавад.