diff --git a/packages/flutter/lib/src/foundation/change_notifier.dart b/packages/flutter/lib/src/foundation/change_notifier.dart index 7c7848509e..e20df8eb99 100644 --- a/packages/flutter/lib/src/foundation/change_notifier.dart +++ b/packages/flutter/lib/src/foundation/change_notifier.dart @@ -30,23 +30,26 @@ abstract class ChangeNotifier { /// This method should only be called by the object's owner. @mustCallSuper void dispose() { - _listeners = null; + _listeners = const []; } /// Call all the registered listeners. /// /// Call this method whenever the object changes, to notify any clients the - /// object may have. + /// object may have. Listeners that are added during this iteration will not + /// be visited. Listeners that are removed during this iteration will not be + /// visited after they are removed. /// /// Exceptions thrown by listeners will be caught and reported using /// [FlutterError.reportError]. @protected void notifyListeners() { if (_listeners != null) { - List listeners = new List.from(_listeners); - for (VoidCallback listener in listeners) { + List localListeners = new List.from(_listeners); + for (VoidCallback listener in localListeners) { try { - listener(); + if (_listeners.contains(listener)) + listener(); } catch (exception, stack) { FlutterError.reportError(new FlutterErrorDetails( exception: exception, diff --git a/packages/flutter/test/foundation/change_notifier_test.dart b/packages/flutter/test/foundation/change_notifier_test.dart index e1b7ae6f73..1d40c856bd 100644 --- a/packages/flutter/test/foundation/change_notifier_test.dart +++ b/packages/flutter/test/foundation/change_notifier_test.dart @@ -102,7 +102,7 @@ void main() { test.addListener(listener2); test.addListener(listener3); test.notify(); - expect(log, equals(['listener1', 'listener2', 'listener3'])); + expect(log, equals(['listener1', 'listener2'])); log.clear(); test.notify();