Sobes.tech
Junior — Middle

Je možné odovzdať triedu do izolácie alebo modulu?

sobes.tech AI

Odpoveď od AI

V Flutteri je izolácia (Isolate) samostatný vlákno vykonávania, ktoré nezdieľa pamäť s hlavným vláknom. Priamo preniesť triedu alebo objekt z jedného izolátu do druhého nie je možné, pretože nemôžu zdieľať pamäť.

Avšak, serializovateľné údaje (napríklad primitívne typy, zoznamy, mapy) je možné prenášať, ktoré môžu byť použité na vytvorenie inštancií tried v inom izoláte. Na výmenu údajov medzi izolátmi sa zvyčajne používajú správy cez SendPort a ReceivePort.

Príklad prenosu údajov medzi izolátmi:

import 'dart:isolate';

class MyClass {
  final int value;
  MyClass(this.value);

  Map<String, dynamic> toMap() => {'value': value};

  static MyClass fromMap(Map<String, dynamic> map) => MyClass(map['value']);
}

void isolateEntry(SendPort sendPort) {
  final myObject = MyClass(42);
  sendPort.send(myObject.toMap());
}

void main() async {
  final receivePort = ReceivePort();
  await Isolate.spawn(isolateEntry, receivePort.sendPort);

  receivePort.listen((message) {
    final myObject = MyClass.fromMap(message);
    print('Prijatá hodnota: \\${myObject.value}');
  });
}

Týmto spôsobom triedu nie je možné preniesť priamo, ale je možné prenášať údaje na rekonštrukciu objektu v inom izoláte.