messages property Null safety
A stream of Message
Implementation
Stream<Message> get messages {
late StreamController<Message> controller;
bool canYield = true;
void tick() async {
var subscription = _mercure.listen((event) async {
if (controller.isClosed) {
return;
}
try {
if (!canYield) return;
var encodedData = jsonDecode(event.data);
if (encodedData['@type'] == 'Account') {
return;
}
Map<String, dynamic> data = await Requests.get<Map>(
'/messages/${encodedData['id']}',
auths[id]!.headers,
) as Map<String, dynamic>;
data['intro'] = encodedData['intro'];
controller.add(messageFromJson(data));
} catch (e) {
controller.addError(e);
}
});
Timer.periodic(Duration(seconds: 3), (timer) async {
if (controller.isClosed) {
timer.cancel();
await subscription.cancel();
}
});
}
tick();
void listen() {
canYield = true;
}
void pause() {
canYield = false;
}
Future<void> cancel() async {
canYield = false;
await controller.close();
return;
}
controller = StreamController<Message>(
onListen: listen,
onPause: pause,
onResume: listen,
onCancel: cancel,
);
return controller.stream;
}