Fix leaking animation in floating action button. (#3575)
diff --git a/examples/stocks/test/locale_test.dart b/examples/stocks/test/locale_test.dart
index b2f9178..a23c1e9 100644
--- a/examples/stocks/test/locale_test.dart
+++ b/examples/stocks/test/locale_test.dart
@@ -20,10 +20,6 @@
       tester.setLocale("es", "US");
       tester.pump();
       expect(tester, hasWidget(find.text('MERCADO')));
-
-      // TODO(abarth): We're leaking an animation. We should track down the leak
-      // and plug it rather than waiting for the animation to end here.
-      tester.pump(const Duration(seconds: 1));
     });
   });
 }
diff --git a/packages/flutter/lib/src/material/floating_action_button.dart b/packages/flutter/lib/src/material/floating_action_button.dart
index 62e8103..90fdaa2 100644
--- a/packages/flutter/lib/src/material/floating_action_button.dart
+++ b/packages/flutter/lib/src/material/floating_action_button.dart
@@ -110,6 +110,12 @@
   }
 
   @override
+  void dispose() {
+    _childSegueController.dispose();
+    super.dispose();
+  }
+
+  @override
   void didUpdateConfig(FloatingActionButton oldConfig) {
     super.didUpdateConfig(oldConfig);
     if (Widget.canUpdate(oldConfig.child, config.child) && config.backgroundColor == oldConfig.backgroundColor)
diff --git a/packages/flutter/lib/src/scheduler/binding.dart b/packages/flutter/lib/src/scheduler/binding.dart
index db3f46e..9c3123d 100644
--- a/packages/flutter/lib/src/scheduler/binding.dart
+++ b/packages/flutter/lib/src/scheduler/binding.dart
@@ -250,10 +250,17 @@
           exception: reason,
           library: 'scheduler library',
           informationCollector: (StringBuffer information) {
-            information.writeln(
-              'There ${ transientCallbackCount == 1 ? "was one transient callback" : "were $transientCallbackCount transient callbacks" } '
-              'left. The stack traces for when they were registered are as follows:'
-            );
+            if (transientCallbackCount == 1) {
+              information.writeln(
+                'There was one transient callback left. '
+                'The stack traces for when it was registered is as follows:'
+              );
+            } else {
+              information.writeln(
+                'There were $transientCallbackCount transient callbacks left. '
+                'The stack traces for when they were registered are as follows:'
+              );
+            }
             for (int id in _transientCallbacks.keys) {
               _FrameCallbackEntry entry = _transientCallbacks[id];
               information.writeln('-- callback $id --');