【发布时间】:2021-04-04 21:24:51
【问题描述】:
我在我的 Flutter 应用程序中调用了以下 Dart Isolate,它每 7 秒通过 _checkTimer 方法运行和处理一项任务。这对于我需要每隔一段时间运行的后台任务非常方便。
import 'dart:async';
import 'dart:isolate';
class TimeTrackingDigester with ChangeNotifier {
Isolate _isolate;
static int _counter = 0;
ReceivePort _receivePort;
void startIsolate() async {
print('**** time tracking digester = startIsolate');
_receivePort = ReceivePort();
_isolate = await Isolate.spawn(
_checkTimer,
_receivePort.sendPort,
);
_receivePort.listen(
_handleMessage,
onDone: () {
//@TODO this never fires
print('done!');
},
);
}
void stopIsolate() => _stop();
static void _checkTimer(SendPort sendPort) async {
print('**** time tracking digestoer = checkTimer');
Timer.periodic(
const Duration(seconds: 7),
(Timer t) async {
_counter++;
print('**** time tracking digestoer = $_counter');
var task = 'result from some action here';
sendPort.send(task);
},
);
}
void _handleMessage(dynamic data) {
print('**** time tracking digestoer = handleMessage');
print('RECEIVED: $data');
}
//@TODO this is not stopping the isolate
void _stop() {
print('**** time tracking digestoer = stop');
print(_isolate);
if (_isolate != null) {
print('* isolate is not null');
// setState(() {
// _running = false;
//
// });
_receivePort.close();
_isolate.kill(priority: Isolate.immediate);
_isolate = null;
}
}
}
我的第一个问题是,一旦隔离启动,我调用 stopIsolate 方法来停止隔离,但它不会触发 close()/kill() 调用,因为 _isolate 被认为是 null。据我所知,_isolate 始终是null,我错过了在以下节中实际设置_isolate 的步骤:
if (_isolate != null) {
print('* isolate is not null');
// setState(() {
// _running = false;
//
// });
_receivePort.close();
_isolate.kill(priority: Isolate.immediate);
_isolate = null;
}
我的第二个问题是,如果我忽略 null 检查,而只是调用 close()/kill() 方法,则会引发以下异常:
NoSuchMethodError:在 null 上调用了方法“close”。我/颤动 (15558):接收器:空 I/颤振 (15558):尝试调用:close()
我想要完成的最终结果:当我想停止 Isolate 时,它会完全停止后续的 _checkTimer 方法,并解决 _isolate 未正确设置以触发 null 检查正确。
【问题讨论】:
-
没有关于分离物的糊涂知识,但我认为这可以提供帮助,如果您还没有看过的话。 stackoverflow.com/a/63433061/10285344