diff --git a/lib/widgets/controller.dart b/lib/widgets/controller.dart index 59aa1e09..a0c2aa78 100644 --- a/lib/widgets/controller.dart +++ b/lib/widgets/controller.dart @@ -32,6 +32,13 @@ class QuillController extends ChangeNotifier { Style toggledStyle = Style(); bool ignoreFocusOnTextChange = false; + /// Controls whether this [QuillController] instance has already been disposed + /// of + /// + /// This is a safe approach to make sure that listeners don't crash when + /// adding, removing or listeners to this instance. + bool _isDisposed = false; + // item1: Document state before [change]. // // item2: Change delta applied to the document. @@ -183,9 +190,31 @@ class QuillController extends ChangeNotifier { notifyListeners(); } + @override + void addListener(VoidCallback listener) { + // By using `_isDisposed`, make sure that `addListener` won't be called on a + // disposed `ChangeListener` + if (!_isDisposed) { + super.addListener(listener); + } + } + + @override + void removeListener(VoidCallback listener) { + // By using `_isDisposed`, make sure that `removeListener` won't be called + // on a disposed `ChangeListener` + if (!_isDisposed) { + super.removeListener(listener); + } + } + @override void dispose() { - document.close(); + if (!_isDisposed) { + document.close(); + } + + _isDisposed = true; super.dispose(); }