diff --git a/packages/flutter/lib/src/foundation/change_notifier.dart b/packages/flutter/lib/src/foundation/change_notifier.dart index f79fb7b2da6..71c7fc230b9 100644 --- a/packages/flutter/lib/src/foundation/change_notifier.dart +++ b/packages/flutter/lib/src/foundation/change_notifier.dart @@ -170,11 +170,10 @@ class ChangeNotifier implements Listenable { /// [notifyListeners]; and similarly, by overriding [removeListener], checking /// if [hasListeners] is false after calling `super.removeListener()`, and if /// so, stopping that same work. + /// + /// This method returns false if [dispose] has been called. @protected - bool get hasListeners { - assert(ChangeNotifier.debugAssertNotDisposed(this)); - return _count > 0; - } + bool get hasListeners => _count > 0; /// Register a closure to be called when the object changes. /// diff --git a/packages/flutter/test/foundation/change_notifier_test.dart b/packages/flutter/test/foundation/change_notifier_test.dart index cfdf4aa59f2..8ff4e29a89b 100644 --- a/packages/flutter/test/foundation/change_notifier_test.dart +++ b/packages/flutter/test/foundation/change_notifier_test.dart @@ -349,6 +349,20 @@ void main() { expect(error, isNull); }); + test('Can check hasListener on a disposed ChangeNotifier', () { + final HasListenersTester source = HasListenersTester(0); + source.addListener(() { }); + expect(source.testHasListeners, isTrue); + FlutterError? error; + try { + source.dispose(); + expect(source.testHasListeners, isFalse); + } on FlutterError catch (e) { + error = e; + } + expect(error, isNull); + }); + test('Value notifier', () { final ValueNotifier notifier = ValueNotifier(2.0);