dispose method
Implementation
Future<void> dispose() async {
if (_disposed) return;
_disposed = true;
_retryTimer?.cancel();
await _watchSub?.cancel();
_viewport.removeListener(_onViewportChanged);
_viewport.dispose();
await _controller.close();
}