Изоляторы могут находить друг друга, регистрируя и просматривая имена с помощью IsolateNameServer
Вам нужно имя для порта, который могут видеть основной изолятор и обратный вызов, кажется, что глобальная константадля этого все в порядке.
Обратный вызов таймера, переданный AlarmManager.oneShot , не имеет параметра, поэтому ему нужно найти имя порта, чтобы найти SendPort для использования, когда онработает.
Зарегистрируйте имя порта для SendPort главного изолята при настройке - вам все еще нужен ReceivePort в MyAppState , но вам не нужен SendPort.
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:android_alarm_manager/android_alarm_manager.dart';
import 'dart:isolate';
import 'dart:ui';
const String portName = "MyAppPort";
class MyApp extends StatefulWidget {
_MyAppState createState() => _MyAppState();
}
startTimer() async {
await AndroidAlarmManager.oneShot(
Duration(seconds: 60), 0, timerCallback,
wakeup: true, exact: true);
}
timerCallback() {
SendPort sendPort = IsolateNameServer.lookupPortByName(portName);
if (sendPort != null) {
sendport.send("DONE");
}
}
class _MyAppState extends State<MyApp> {
ReceivePort receivePort = ReceivePort();
@override
void initState() {
super.initState();
IsolateNameServer.registerPortName(receivePort.sendPort, portName)
AndroidAlarmManager.initialize();
receivePort.listen((v) {
print(v);
});
}
@override
Widget build(BuildContext context) {
RaisedButton(
onPressed: startTimer(),
child: Text("Start"),
);
}