| import 'package:jaspr/jaspr.dart'; |
| |
| /// A [ChangeNotifier] that silently ignores [notifyListeners] calls after |
| /// [dispose] has been invoked. |
| /// |
| /// Project-scoped ViewModels subscribe to long-lived streams (workspace, |
| /// LSP, logger) whose async cancellation can race with disposal. Extending |
| /// this class instead of plain [ChangeNotifier] prevents the resulting |
| /// "used after being disposed" errors without per-callback guards. |
| abstract class SafeChangeNotifier extends ChangeNotifier { |
| bool _disposed = false; |
| |
| /// Whether [dispose] has already been called. |
| bool get disposed => _disposed; |
| |
| @override |
| void dispose() { |
| _disposed = true; |
| super.dispose(); |
| } |
| |
| @override |
| void notifyListeners() { |
| if (_disposed) { |
| return; |
| } |
| super.notifyListeners(); |
| } |
| } |