Пользовательский интерфейс показывает две кнопки: одна кнопка для запуска изоляции, а вторая - для ее остановки в следующий раз. Код UI (виджета) выглядит так:
SendPort sendToIsolatePort;
void _onStartIsolateButtonPushed() async {
ReceivePort receivePort = ReceivePort();
receivePort.listen(onMessageReceivedFromIsolate);
Isolate.spawn(runAsIsolate, receivePort.sendPort);
}
void _onStopIsolateButtonPushed() async {
sendToIsolatePort.send("Stop");
}
void onMessageReceivedFromIsolate(var message) {
if (message is String) {
print("Message received from isolate: " + message);
} else if (message is SendPort) {
print("Reply port received");
sendToIsolatePort = message;
sendToIsolatePort.send("Hello World?!?");
}
}
Код в isolate.dart выглядит так: (Примечание: этот код не в виджете или классе, а только в некоторых глобальных функциях)
import 'dart:isolate';
SendPort sendPort;
bool isRunning;
void runAsIsolate(SendPort port) async {
sendPort = port;
ReceivePort receivePort = ReceivePort();
receivePort.listen(onIsolateMessageReceived);
isRunning = true;
sendPort.send(receivePort.sendPort);
while (isRunning) {
_doSomething();
_doSomethingMore();
}
receivePort.close();
sendPort.send("Stopped");
print("Leaving isolate...");
}
void onIsolateMessageReceived(var message) {
if (message is String) {
print("Isolate: messate received: " + message);
if (message == "Stop") {
isRunning = false;
}
} else {
print("WTFlutter... " + message.toString());
}
}
void _doSomething() {}
void _doSomethingMore() {}
Теперь по какой-то причине изолят не получает Hello World?!? ни сообщение Stop. У вас есть идеи, почему? А как исправить?
Также: есть ли более простой (или более короткий) способ выполнения потока во флаттере? Изолированный подход и его потоковая связь кажутся слишком сложными для чего-то столь же распространенного, как параллельное выполнение.
Ваш совет очень признателен. Спасибо.
else
и напечатать что-нибудь в своемonMessageReceivedFromIsolate
для отладки - person ch271828n   schedule 15.01.2021sendToIsolatePort
) доставляется черезonMessageReceivedFromIsolate()
). Проблема возникает при отправке из виджета в изолятор: кажется, чтоsendToIsolatePort.send()
выполняется (в виджете), ноonIsolateMessageReceived()
не вызывается (в изоляторе). Другими словами: сообщения не доходят до изолятора. Довольно сложно ... - person SePröbläm   schedule 15.01.2021while (isRunning)
будет все время тратить в нашем основном изоляторе. таким образом, некогда вашonIsolateMessageReceived
может быть назван! Попробуйте удалить цикл while и сделайте это вместо этого:while(isRunning) await Future.delayed(Duration(seconds: 1));
- person ch271828n   schedule 16.01.2021