dispose method
Disposes the parser and cleans up all resources.
This method:
- Cancels the stream subscription
- Closes all stream controllers
- Completes any pending futures with an error if they haven't completed
- Clears all internal state
After calling dispose(), this parser instance should not be used.
Implementation
Future<void> dispose() async {
if (_isDisposed) {
return;
}
_isDisposed = true;
// Cancel the stream subscription
await _streamSubscription.cancel();
// Close all stream controllers and complete pending futures with errors
for (final controller in _propertyControllers.values) {
if (controller is StringPropertyStreamController) {
if (!controller.completer.isCompleted) {
controller.completer.completeError(
StateError('Parser was disposed before property completed'),
);
}
if (!controller.streamController.isClosed) {
await controller.streamController.close();
}
} else if (controller is NumberPropertyStreamController) {
if (!controller.completer.isCompleted) {
controller.completer.completeError(
StateError('Parser was disposed before property completed'),
);
}
if (!controller.streamController.isClosed) {
await controller.streamController.close();
}
} else if (controller is BooleanPropertyStreamController) {
if (!controller.completer.isCompleted) {
controller.completer.completeError(
StateError('Parser was disposed before property completed'),
);
}
if (!controller.streamController.isClosed) {
await controller.streamController.close();
}
} else if (controller is NullPropertyStreamController) {
if (!controller.completer.isCompleted) {
controller.completer.completeError(
StateError('Parser was disposed before property completed'),
);
}
if (!controller.streamController.isClosed) {
await controller.streamController.close();
}
} else if (controller is MapPropertyStreamController) {
if (!controller.completer.isCompleted) {
controller.completer.completeError(
StateError('Parser was disposed before property completed'),
);
}
} else if (controller is ListPropertyStreamController) {
if (!controller.completer.isCompleted) {
controller.completer.completeError(
StateError('Parser was disposed before property completed'),
);
}
}
}
// Clear all state
_propertyControllers.clear();
_rootDelegate = null;
}