add missing type parameter on methods (#22096)

diff --git a/packages/flutter/lib/src/cupertino/button.dart b/packages/flutter/lib/src/cupertino/button.dart
index 046cc11..323d2c6 100644
--- a/packages/flutter/lib/src/cupertino/button.dart
+++ b/packages/flutter/lib/src/cupertino/button.dart
@@ -191,7 +191,7 @@
     final Future<Null> ticker = _buttonHeldDown
         ? _animationController.animateTo(1.0, duration: kFadeOutDuration)
         : _animationController.animateTo(0.0, duration: kFadeInDuration);
-    ticker.then((Null value) {
+    ticker.then<void>((Null value) {
       if (mounted && wasHeldDown != _buttonHeldDown)
         _animate();
     });
diff --git a/packages/flutter/lib/src/cupertino/dialog.dart b/packages/flutter/lib/src/cupertino/dialog.dart
index 092beb0..4f5c7ce 100644
--- a/packages/flutter/lib/src/cupertino/dialog.dart
+++ b/packages/flutter/lib/src/cupertino/dialog.dart
@@ -1564,7 +1564,7 @@
         )
       : Rect.zero;
 
-    final List<Rect> pressedButtonRects = _pressedButtons.map((RenderBox pressedButton) {
+    final List<Rect> pressedButtonRects = _pressedButtons.map<Rect>((RenderBox pressedButton) {
       final MultiChildLayoutParentData buttonParentData = pressedButton.parentData;
 
       return Rect.fromLTWH(
diff --git a/packages/flutter/lib/src/foundation/isolates.dart b/packages/flutter/lib/src/foundation/isolates.dart
index 603e052..7eaf618 100644
--- a/packages/flutter/lib/src/foundation/isolates.dart
+++ b/packages/flutter/lib/src/foundation/isolates.dart
@@ -50,7 +50,7 @@
   Timeline.startSync('$debugLabel: start', flow: flow);
   final ReceivePort resultPort = ReceivePort();
   Timeline.finishSync();
-  final Isolate isolate = await Isolate.spawn(
+  final Isolate isolate = await Isolate.spawn<_IsolateConfiguration<Q, R>>(
     _spawn,
     _IsolateConfiguration<Q, R>(
       callback,
diff --git a/packages/flutter/lib/src/foundation/print.dart b/packages/flutter/lib/src/foundation/print.dart
index 2e8acd1..434dbb2 100644
--- a/packages/flutter/lib/src/foundation/print.dart
+++ b/packages/flutter/lib/src/foundation/print.dart
@@ -32,7 +32,7 @@
 /// Used by tests.
 void debugPrintSynchronously(String message, { int wrapWidth }) {
   if (wrapWidth != null) {
-    print(message.split('\n').expand((String line) => debugWordWrap(line, wrapWidth)).join('\n'));
+    print(message.split('\n').expand<String>((String line) => debugWordWrap(line, wrapWidth)).join('\n'));
   } else {
     print(message);
   }
@@ -42,7 +42,7 @@
 /// messages on platforms that rate-limit their logging (for example, Android).
 void debugPrintThrottled(String message, { int wrapWidth }) {
   if (wrapWidth != null) {
-    _debugPrintBuffer.addAll(message.split('\n').expand((String line) => debugWordWrap(line, wrapWidth)));
+    _debugPrintBuffer.addAll(message.split('\n').expand<String>((String line) => debugWordWrap(line, wrapWidth)));
   } else {
     _debugPrintBuffer.addAll(message.split('\n'));
   }
diff --git a/packages/flutter/lib/src/material/animated_icons/animated_icons.dart b/packages/flutter/lib/src/material/animated_icons/animated_icons.dart
index 1077544..6284d47 100644
--- a/packages/flutter/lib/src/material/animated_icons/animated_icons.dart
+++ b/packages/flutter/lib/src/material/animated_icons/animated_icons.dart
@@ -195,7 +195,7 @@
   final List<double> opacities;
 
   void paint(ui.Canvas canvas, Color color, _UiPathFactory uiPathFactory, double progress) {
-    final double opacity = _interpolate(opacities, progress, lerpDouble);
+    final double opacity = _interpolate<double>(opacities, progress, lerpDouble);
     final ui.Paint paint = ui.Paint()
       ..style = PaintingStyle.fill
       ..color = color.withOpacity(color.opacity * opacity);
@@ -227,7 +227,7 @@
 
   @override
   void apply(Path path, double progress) {
-    final Offset offset = _interpolate(points, progress, Offset.lerp);
+    final Offset offset = _interpolate<Offset>(points, progress, Offset.lerp);
     path.moveTo(offset.dx, offset.dy);
   }
 }
@@ -241,9 +241,9 @@
 
   @override
   void apply(Path path, double progress) {
-    final Offset controlPoint1 = _interpolate(controlPoints1, progress, Offset.lerp);
-    final Offset controlPoint2 = _interpolate(controlPoints2, progress, Offset.lerp);
-    final Offset targetPoint = _interpolate(targetPoints, progress, Offset.lerp);
+    final Offset controlPoint1 = _interpolate<Offset>(controlPoints1, progress, Offset.lerp);
+    final Offset controlPoint2 = _interpolate<Offset>(controlPoints2, progress, Offset.lerp);
+    final Offset targetPoint = _interpolate<Offset>(targetPoints, progress, Offset.lerp);
     path.cubicTo(
       controlPoint1.dx, controlPoint1.dy,
       controlPoint2.dx, controlPoint2.dy,
@@ -260,7 +260,7 @@
 
   @override
   void apply(Path path, double progress) {
-    final Offset point = _interpolate(points, progress, Offset.lerp);
+    final Offset point = _interpolate<Offset>(points, progress, Offset.lerp);
     path.lineTo(point.dx, point.dy);
   }
 }
diff --git a/packages/flutter/lib/src/material/bottom_navigation_bar.dart b/packages/flutter/lib/src/material/bottom_navigation_bar.dart
index 1116501..9024b53 100644
--- a/packages/flutter/lib/src/material/bottom_navigation_bar.dart
+++ b/packages/flutter/lib/src/material/bottom_navigation_bar.dart
@@ -582,7 +582,7 @@
     double weightSum(Iterable<Animation<double>> animations) {
       // We're adding flex values instead of animation values to produce correct
       // ratios.
-      return animations.map(state._evaluateFlex).fold(0.0, (double sum, double value) => sum + value);
+      return animations.map<double>(state._evaluateFlex).fold<double>(0.0, (double sum, double value) => sum + value);
     }
 
     final double allWeights = weightSum(state._animations);
diff --git a/packages/flutter/lib/src/material/mergeable_material.dart b/packages/flutter/lib/src/material/mergeable_material.dart
index 5e333a2..757b6d3 100644
--- a/packages/flutter/lib/src/material/mergeable_material.dart
+++ b/packages/flutter/lib/src/material/mergeable_material.dart
@@ -278,10 +278,10 @@
   void didUpdateWidget(MergeableMaterial oldWidget) {
     super.didUpdateWidget(oldWidget);
 
-    final Set<LocalKey> oldKeys = oldWidget.children.map(
+    final Set<LocalKey> oldKeys = oldWidget.children.map<LocalKey>(
       (MergeableMaterialItem child) => child.key
     ).toSet();
-    final Set<LocalKey> newKeys = widget.children.map(
+    final Set<LocalKey> newKeys = widget.children.map<LocalKey>(
       (MergeableMaterialItem child) => child.key
     ).toSet();
     final Set<LocalKey> newOnly = newKeys.difference(oldKeys);
diff --git a/packages/flutter/lib/src/material/user_accounts_drawer_header.dart b/packages/flutter/lib/src/material/user_accounts_drawer_header.dart
index 7c37659..3ca9773 100644
--- a/packages/flutter/lib/src/material/user_accounts_drawer_header.dart
+++ b/packages/flutter/lib/src/material/user_accounts_drawer_header.dart
@@ -30,7 +30,7 @@
           top: 0.0,
           end: 0.0,
           child: Row(
-            children: (otherAccountsPictures ?? <Widget>[]).take(3).map((Widget picture) {
+            children: (otherAccountsPictures ?? <Widget>[]).take(3).map<Widget>((Widget picture) {
               return Padding(
                 padding: const EdgeInsetsDirectional.only(start: 8.0),
                 child: Semantics(
diff --git a/packages/flutter/lib/src/painting/image_resolution.dart b/packages/flutter/lib/src/painting/image_resolution.dart
index 7b9bb82..2061de0 100644
--- a/packages/flutter/lib/src/painting/image_resolution.dart
+++ b/packages/flutter/lib/src/painting/image_resolution.dart
@@ -223,7 +223,7 @@
     final Iterable<String> keys = parsedJson.keys;
     final Map<String, List<String>> parsedManifest =
         Map<String, List<String>>.fromIterables(keys,
-          keys.map((String key) => List<String>.from(parsedJson[key])));
+          keys.map<List<String>>((String key) => List<String>.from(parsedJson[key])));
     // TODO(ianh): convert that data structure to the right types.
     return SynchronousFuture<Map<String, List<String>>>(parsedManifest);
   }
diff --git a/packages/flutter/lib/src/painting/text_span.dart b/packages/flutter/lib/src/painting/text_span.dart
index f2a08d5..55a8f15 100644
--- a/packages/flutter/lib/src/painting/text_span.dart
+++ b/packages/flutter/lib/src/painting/text_span.dart
@@ -355,7 +355,7 @@
   List<DiagnosticsNode> debugDescribeChildren() {
     if (children == null)
       return const <DiagnosticsNode>[];
-    return children.map((TextSpan child) {
+    return children.map<DiagnosticsNode>((TextSpan child) {
       if (child != null) {
         return child.toDiagnosticsNode();
       } else {
diff --git a/packages/flutter/lib/src/rendering/custom_layout.dart b/packages/flutter/lib/src/rendering/custom_layout.dart
index 79f0577..1b44d04 100644
--- a/packages/flutter/lib/src/rendering/custom_layout.dart
+++ b/packages/flutter/lib/src/rendering/custom_layout.dart
@@ -214,7 +214,7 @@
           if (_debugChildrenNeedingLayout.length > 1) {
             throw FlutterError(
               'The $this custom multichild layout delegate forgot to lay out the following children:\n'
-              '  ${_debugChildrenNeedingLayout.map(_debugDescribeChild).join("\n  ")}\n'
+              '  ${_debugChildrenNeedingLayout.map<String>(_debugDescribeChild).join("\n  ")}\n'
               'Each child must be laid out exactly once.'
             );
           } else {
diff --git a/packages/flutter/lib/src/rendering/layer.dart b/packages/flutter/lib/src/rendering/layer.dart
index 2c12b3e..c018819 100644
--- a/packages/flutter/lib/src/rendering/layer.dart
+++ b/packages/flutter/lib/src/rendering/layer.dart
@@ -1140,7 +1140,7 @@
 
   @override
   S find<S>(Offset regionOffset) {
-    return super.find(regionOffset - offset);
+    return super.find<S>(regionOffset - offset);
   }
 
   @override
diff --git a/packages/flutter/lib/src/rendering/platform_view.dart b/packages/flutter/lib/src/rendering/platform_view.dart
index dc87c77..bf03b12 100644
--- a/packages/flutter/lib/src/rendering/platform_view.dart
+++ b/packages/flutter/lib/src/rendering/platform_view.dart
@@ -382,8 +382,8 @@
         eventTime: event.timeStamp.inMilliseconds,
         action: action,
         pointerCount: pointerPositions.length,
-        pointerProperties: pointers.map((int i) => pointerProperties[i]).toList(),
-        pointerCoords: pointers.map((int i) => pointerPositions[i]).toList(),
+        pointerProperties: pointers.map<AndroidPointerProperties>((int i) => pointerProperties[i]).toList(),
+        pointerCoords: pointers.map<AndroidPointerCoords>((int i) => pointerPositions[i]).toList(),
         metaState: 0,
         buttonState: 0,
         xPrecision: 1.0,
diff --git a/packages/flutter/lib/src/scheduler/ticker.dart b/packages/flutter/lib/src/scheduler/ticker.dart
index a943a91..cd4d77b 100644
--- a/packages/flutter/lib/src/scheduler/ticker.dart
+++ b/packages/flutter/lib/src/scheduler/ticker.dart
@@ -389,7 +389,7 @@
       callback();
       return null;
     }
-    orCancel.then(thunk, onError: thunk);
+    orCancel.then<Null>(thunk, onError: thunk);
   }
 
   /// A future that resolves when this future resolves or throws when the ticker
diff --git a/packages/flutter/lib/src/semantics/semantics.dart b/packages/flutter/lib/src/semantics/semantics.dart
index 6d956ba..9837cfb 100644
--- a/packages/flutter/lib/src/semantics/semantics.dart
+++ b/packages/flutter/lib/src/semantics/semantics.dart
@@ -1844,12 +1844,12 @@
       if (scale != null) {
         description = '$rect scaled by ${scale.toStringAsFixed(1)}x';
       } else if (transform != null && !MatrixUtils.isIdentity(transform)) {
-        final String matrix = transform.toString().split('\n').take(4).map((String line) => line.substring(4)).join('; ');
+        final String matrix = transform.toString().split('\n').take(4).map<String>((String line) => line.substring(4)).join('; ');
         description = '$rect with transform [$matrix]';
       }
       properties.add(DiagnosticsProperty<Rect>('rect', rect, description: description, showName: false));
     }
-    final List<String> actions = _actions.keys.map((SemanticsAction action) => describeEnum(action)).toList()..sort();
+    final List<String> actions = _actions.keys.map<String>((SemanticsAction action) => describeEnum(action)).toList()..sort();
     final List<String> customSemanticsActions = _customSemanticsActions.keys
       .map<String>((CustomSemanticsAction action) => action.label)
       .toList();
@@ -2118,7 +2118,7 @@
       sortedIds.add(id);
     }
 
-    startNodes.map((SemanticsNode node) => node.id).forEach(search);
+    startNodes.map<int>((SemanticsNode node) => node.id).forEach(search);
     return sortedIds.map<SemanticsNode>((int id) => nodeMap[id]).toList().reversed.toList();
   }
 }
diff --git a/packages/flutter/lib/src/services/platform_views.dart b/packages/flutter/lib/src/services/platform_views.dart
index e015a98..0efb9c4 100644
--- a/packages/flutter/lib/src/services/platform_views.dart
+++ b/packages/flutter/lib/src/services/platform_views.dart
@@ -328,8 +328,8 @@
       eventTime,
       action,
       pointerCount,
-      pointerProperties.map((AndroidPointerProperties p) => p._asList()).toList(),
-      pointerCoords.map((AndroidPointerCoords p) => p._asList()).toList(),
+      pointerProperties.map<List<int>>((AndroidPointerProperties p) => p._asList()).toList(),
+      pointerCoords.map<List<double>>((AndroidPointerCoords p) => p._asList()).toList(),
       metaState,
       buttonState,
       xPrecision,
diff --git a/packages/flutter/lib/src/services/text_formatter.dart b/packages/flutter/lib/src/services/text_formatter.dart
index 1eec81c..e421143 100644
--- a/packages/flutter/lib/src/services/text_formatter.dart
+++ b/packages/flutter/lib/src/services/text_formatter.dart
@@ -233,7 +233,7 @@
       (String substring) {
         return whitelistedPattern
             .allMatches(substring)
-            .map((Match match) => match.group(0))
+            .map<String>((Match match) => match.group(0))
             .join();
       } ,
     );
diff --git a/packages/flutter/lib/src/widgets/image.dart b/packages/flutter/lib/src/widgets/image.dart
index 59232c0..91e87ef 100644
--- a/packages/flutter/lib/src/widgets/image.dart
+++ b/packages/flutter/lib/src/widgets/image.dart
@@ -98,7 +98,7 @@
     }
   }
   stream.addListener(listener, onError: errorListener);
-  completer.future.then((Null _) { stream.removeListener(listener); });
+  completer.future.then<void>((Null _) { stream.removeListener(listener); });
   return completer.future;
 }
 
diff --git a/packages/flutter/lib/src/widgets/list_wheel_scroll_view.dart b/packages/flutter/lib/src/widgets/list_wheel_scroll_view.dart
index 78a1af1..cf6c9a5c 100644
--- a/packages/flutter/lib/src/widgets/list_wheel_scroll_view.dart
+++ b/packages/flutter/lib/src/widgets/list_wheel_scroll_view.dart
@@ -266,7 +266,7 @@
         curve: curve,
       ));
     }
-    await Future.wait(futures);
+    await Future.wait<void>(futures);
   }
 
   /// Changes which item index is centered in the controlled scroll view.
diff --git a/packages/flutter/lib/src/widgets/localizations.dart b/packages/flutter/lib/src/widgets/localizations.dart
index 0b4124c..e960ec3 100644
--- a/packages/flutter/lib/src/widgets/localizations.dart
+++ b/packages/flutter/lib/src/widgets/localizations.dart
@@ -74,7 +74,7 @@
     return SynchronousFuture<Map<Type, dynamic>>(output);
 
   // Some of delegate.load() values were asynchronous futures. Wait for them.
-  return Future.wait<dynamic>(pendingList.map((_Pending p) => p.futureValue))
+  return Future.wait<dynamic>(pendingList.map<Future<dynamic>>((_Pending p) => p.futureValue))
     .then<Map<Type, dynamic>>((List<dynamic> values) {
       assert(values.length == pendingList.length);
       for (int i = 0; i < values.length; i += 1) {
@@ -502,7 +502,7 @@
 
     Map<Type, dynamic> typeToResources;
     final Future<Map<Type, dynamic>> typeToResourcesFuture = _loadAll(locale, delegates)
-      .then((Map<Type, dynamic> value) {
+      .then<Map<Type, dynamic>>((Map<Type, dynamic> value) {
         return typeToResources = value;
       });
 
@@ -516,7 +516,7 @@
       // - If we're running at app startup time then defer reporting the first
       // "useful" frame until after the async load has completed.
       WidgetsBinding.instance.deferFirstFrameReport();
-      typeToResourcesFuture.then((Map<Type, dynamic> value) {
+      typeToResourcesFuture.then<void>((Map<Type, dynamic> value) {
         WidgetsBinding.instance.allowFirstFrameReport();
         if (!mounted)
           return;
diff --git a/packages/flutter/lib/src/widgets/routes.dart b/packages/flutter/lib/src/widgets/routes.dart
index fd6d3df..9da5253 100644
--- a/packages/flutter/lib/src/widgets/routes.dart
+++ b/packages/flutter/lib/src/widgets/routes.dart
@@ -660,6 +660,7 @@
   ///
   /// The given [BuildContext] will be rebuilt if the state of the route changes
   /// (specifically, if [isCurrent] or [canPop] change value).
+  @optionalTypeArgs
   static ModalRoute<T> of<T extends Object>(BuildContext context) {
     final _ModalScopeStatus widget = context.inheritFromWidgetOfExactType(_ModalScopeStatus);
     return widget?.route;
@@ -1519,7 +1520,7 @@
 }) {
   assert(pageBuilder != null);
   assert(!barrierDismissible || barrierLabel != null);
-  return Navigator.of(context, rootNavigator: true).push(_DialogRoute<T>(
+  return Navigator.of(context, rootNavigator: true).push<T>(_DialogRoute<T>(
     pageBuilder: pageBuilder,
     barrierDismissible: barrierDismissible,
     barrierLabel: barrierLabel,
diff --git a/packages/flutter/lib/src/widgets/scroll_controller.dart b/packages/flutter/lib/src/widgets/scroll_controller.dart
index 3c37682..abaf543 100644
--- a/packages/flutter/lib/src/widgets/scroll_controller.dart
+++ b/packages/flutter/lib/src/widgets/scroll_controller.dart
@@ -150,7 +150,7 @@
     final List<Future<Null>> animations = List<Future<Null>>(_positions.length);
     for (int i = 0; i < _positions.length; i += 1)
       animations[i] = _positions[i].animateTo(offset, duration: duration, curve: curve);
-    return Future.wait<Null>(animations).then((List<Null> _) => null);
+    return Future.wait<Null>(animations).then<Null>((List<Null> _) => null);
   }
 
   /// Jumps the scroll position from its current value to the given value,
diff --git a/packages/flutter/lib/src/widgets/scrollable.dart b/packages/flutter/lib/src/widgets/scrollable.dart
index fac04a3..d64c67a 100644
--- a/packages/flutter/lib/src/widgets/scrollable.dart
+++ b/packages/flutter/lib/src/widgets/scrollable.dart
@@ -213,7 +213,7 @@
       return Future<Null>.value();
     if (futures.length == 1)
       return futures.single;
-    return Future.wait<Null>(futures).then((List<Null> _) => null);
+    return Future.wait<Null>(futures).then<Null>((List<Null> _) => null);
   }
 }
 
diff --git a/packages/flutter/lib/src/widgets/table.dart b/packages/flutter/lib/src/widgets/table.dart
index 9023b57..85257f1 100644
--- a/packages/flutter/lib/src/widgets/table.dart
+++ b/packages/flutter/lib/src/widgets/table.dart
@@ -141,7 +141,7 @@
                               : null,
        super(key: key) {
     assert(() {
-      final List<Widget> flatChildren = children.expand((TableRow row) => row.children).toList(growable: false);
+      final List<Widget> flatChildren = children.expand<Widget>((TableRow row) => row.children).toList(growable: false);
       if (debugChildrenHaveDuplicateKeys(this, flatChildren)) {
         throw FlutterError(
           'Two or more cells in this Table contain widgets with the same key.\n'
@@ -255,7 +255,7 @@
     super.mount(parent, newSlot);
     assert(!_debugWillReattachChildren);
     assert(() { _debugWillReattachChildren = true; return true; }());
-    _children = widget.children.map((TableRow row) {
+    _children = widget.children.map<_TableElementRow>((TableRow row) {
       return _TableElementRow(
         key: row.key,
         children: row.children.map<Element>((Widget child) {
@@ -351,7 +351,7 @@
 
   @override
   void visitChildren(ElementVisitor visitor) {
-    for (Element child in _children.expand((_TableElementRow row) => row.children)) {
+    for (Element child in _children.expand<Element>((_TableElementRow row) => row.children)) {
       if (!_forgottenChildren.contains(child))
         visitor(child);
     }
diff --git a/packages/flutter/lib/src/widgets/widget_inspector.dart b/packages/flutter/lib/src/widgets/widget_inspector.dart
index 9b7a624..941de32 100644
--- a/packages/flutter/lib/src/widgets/widget_inspector.dart
+++ b/packages/flutter/lib/src/widgets/widget_inspector.dart
@@ -1262,7 +1262,7 @@
     else
       throw FlutterError('Cannot get parent chain for node of type ${value.runtimeType}');
 
-    return path.map((_DiagnosticsPathNode node) => _pathNodeToJson(
+    return path.map<Object>((_DiagnosticsPathNode node) => _pathNodeToJson(
       node,
       _SerializeConfig(groupName: groupName),
     )).toList();
diff --git a/packages/flutter/test/cupertino/nav_bar_test.dart b/packages/flutter/test/cupertino/nav_bar_test.dart
index 3ccadc0..0855c7e 100644
--- a/packages/flutter/test/cupertino/nav_bar_test.dart
+++ b/packages/flutter/test/cupertino/nav_bar_test.dart
@@ -262,7 +262,7 @@
           return aParagraph.text.style.fontSize.compareTo(bParagraph.text.style.fontSize);
         });
 
-    Iterable<double> opacities = titles.map((Element element) {
+    Iterable<double> opacities = titles.map<double>((Element element) {
       final RenderAnimatedOpacity renderOpacity = element.ancestorRenderObjectOfType(const TypeMatcher<RenderAnimatedOpacity>());
       return renderOpacity.opacity.value;
     });
@@ -287,7 +287,7 @@
           return aParagraph.text.style.fontSize.compareTo(bParagraph.text.style.fontSize);
         });
 
-    opacities = titles.map((Element element) {
+    opacities = titles.map<double>((Element element) {
       final RenderAnimatedOpacity renderOpacity = element.ancestorRenderObjectOfType(const TypeMatcher<RenderAnimatedOpacity>());
       return renderOpacity.opacity.value;
     });
diff --git a/packages/flutter/test/cupertino/route_test.dart b/packages/flutter/test/cupertino/route_test.dart
index de721c5..fd706fc 100644
--- a/packages/flutter/test/cupertino/route_test.dart
+++ b/packages/flutter/test/cupertino/route_test.dart
@@ -80,7 +80,7 @@
           );
         });
 
-    final Iterable<double> opacities = titles.map((Element element) {
+    final Iterable<double> opacities = titles.map<double>((Element element) {
       final RenderAnimatedOpacity renderOpacity =
           element.ancestorRenderObjectOfType(const TypeMatcher<RenderAnimatedOpacity>());
       return renderOpacity.opacity.value;
diff --git a/packages/flutter/test/foundation/caching_iterable_test.dart b/packages/flutter/test/foundation/caching_iterable_test.dart
index f93229d..39e345e 100644
--- a/packages/flutter/test/foundation/caching_iterable_test.dart
+++ b/packages/flutter/test/foundation/caching_iterable_test.dart
@@ -63,7 +63,7 @@
     expect(integers.first, equals(1));
     expect(yieldCount, equals(2));
 
-    expect(evens.map((int i) => i + 1), equals(<int>[3, 5]));
+    expect(evens.map<int>((int i) => i + 1), equals(<int>[3, 5]));
     expect(yieldCount, equals(5));
 
     expect(evens, equals(<int>[2, 4]));
@@ -95,13 +95,13 @@
     final Iterable<int> integers = CachingIterable<int>(range(1, 5).iterator);
     expect(yieldCount, equals(0));
 
-    final Iterable<int> expanded1 = integers.expand((int i) => <int>[i, i]);
+    final Iterable<int> expanded1 = integers.expand<int>((int i) => <int>[i, i]);
 
     expect(yieldCount, equals(0));
     expect(expanded1, equals(<int>[1, 1, 2, 2, 3, 3, 4, 4, 5, 5]));
     expect(yieldCount, equals(5));
 
-    final Iterable<int> expanded2 = integers.expand((int i) => <int>[i, i]);
+    final Iterable<int> expanded2 = integers.expand<int>((int i) => <int>[i, i]);
 
     expect(yieldCount, equals(5));
     expect(expanded2, equals(<int>[1, 1, 2, 2, 3, 3, 4, 4, 5, 5]));
diff --git a/packages/flutter/test/material/app_bar_test.dart b/packages/flutter/test/material/app_bar_test.dart
index b22df03..39687a7 100644
--- a/packages/flutter/test/material/app_bar_test.dart
+++ b/packages/flutter/test/material/app_bar_test.dart
@@ -33,7 +33,7 @@
                   expandedHeight: expandedHeight,
                   snap: snap,
                   bottom: TabBar(
-                    tabs: <String>['A','B','C'].map((String t) => Tab(text: 'TAB $t')).toList(),
+                    tabs: <String>['A','B','C'].map<Widget>((String t) => Tab(text: 'TAB $t')).toList(),
                   ),
                 ),
                 SliverToBoxAdapter(
diff --git a/packages/flutter/test/material/colors_test.dart b/packages/flutter/test/material/colors_test.dart
index 243fb79..7414363 100644
--- a/packages/flutter/test/material/colors_test.dart
+++ b/packages/flutter/test/material/colors_test.dart
@@ -54,12 +54,12 @@
 
   test('Colors swatches do not contain duplicates', () {
     for (MaterialColor color in Colors.primaries)
-      expect(primaryKeys.map((int key) => color[key]).toSet().length, primaryKeys.length);
+      expect(primaryKeys.map<Color>((int key) => color[key]).toSet().length, primaryKeys.length);
 
-    expect(primaryKeys.map((int key) => Colors.grey[key]).toSet().length, primaryKeys.length);
+    expect(primaryKeys.map<Color>((int key) => Colors.grey[key]).toSet().length, primaryKeys.length);
 
     for (MaterialAccentColor color in Colors.accents)
-      expect(accentKeys.map((int key) => color[key]).toSet().length, accentKeys.length);
+      expect(accentKeys.map<Color>((int key) => color[key]).toSet().length, accentKeys.length);
   });
 
   test('All color swatch colors are opaque and equal their primary color', () {
diff --git a/packages/flutter/test/material/data_table_test.dart b/packages/flutter/test/material/data_table_test.dart
index 88cf8e6..d05561f 100644
--- a/packages/flutter/test/material/data_table_test.dart
+++ b/packages/flutter/test/material/data_table_test.dart
@@ -32,7 +32,7 @@
             }
           ),
         ],
-        rows: kDesserts.map((Dessert dessert) {
+        rows: kDesserts.map<DataRow>((Dessert dessert) {
           return DataRow(
             key: Key(dessert.name),
             onSelectChanged: (bool selected) {
diff --git a/packages/flutter/test/material/dropdown_test.dart b/packages/flutter/test/material/dropdown_test.dart
index a5fa903..950629d 100644
--- a/packages/flutter/test/material/dropdown_test.dart
+++ b/packages/flutter/test/material/dropdown_test.dart
@@ -43,7 +43,7 @@
             onChanged: onChanged,
             isDense: isDense,
             isExpanded: isExpanded,
-            items: items.map((String item) {
+            items: items.map<DropdownMenuItem<String>>((String item) {
               return DropdownMenuItem<String>(
                 key: ValueKey<String>(item),
                 value: item,
@@ -407,7 +407,7 @@
 
     // When isDense is true, the button's height is reduced. The menu items'
     // heights are not.
-    final double menuItemHeight = itemBoxes.map((RenderBox box) => box.size.height).reduce(math.max);
+    final double menuItemHeight = itemBoxes.map<double>((RenderBox box) => box.size.height).reduce(math.max);
     expect(menuItemHeight, greaterThan(buttonBox.size.height));
 
     for (RenderBox itemBox in itemBoxes) {
diff --git a/packages/flutter/test/material/list_tile_test.dart b/packages/flutter/test/material/list_tile_test.dart
index 39ecd20..4102acc 100644
--- a/packages/flutter/test/material/list_tile_test.dart
+++ b/packages/flutter/test/material/list_tile_test.dart
@@ -235,7 +235,7 @@
             return ListView(
               children: ListTile.divideTiles(
                 context: context,
-                tiles: titles.map((String title) => ListTile(title: Text(title))),
+                tiles: titles.map<Widget>((String title) => ListTile(title: Text(title))),
               ).toList(),
             );
           },
diff --git a/packages/flutter/test/material/page_selector_test.dart b/packages/flutter/test/material/page_selector_test.dart
index 42a1ae0..8a41013 100644
--- a/packages/flutter/test/material/page_selector_test.dart
+++ b/packages/flutter/test/material/page_selector_test.dart
@@ -52,7 +52,7 @@
       matching: find.byType(TabPageSelectorIndicator)
     )
   );
-  return indicators.map((TabPageSelectorIndicator indicator) => indicator.backgroundColor).toList();
+  return indicators.map<Color>((TabPageSelectorIndicator indicator) => indicator.backgroundColor).toList();
 }
 
 void main() {
diff --git a/packages/flutter/test/material/refresh_indicator_test.dart b/packages/flutter/test/material/refresh_indicator_test.dart
index ea49f94..4e6e0be 100644
--- a/packages/flutter/test/material/refresh_indicator_test.dart
+++ b/packages/flutter/test/material/refresh_indicator_test.dart
@@ -29,7 +29,7 @@
           onRefresh: refresh,
           child: ListView(
             physics: const AlwaysScrollableScrollPhysics(),
-            children: <String>['A', 'B', 'C', 'D', 'E', 'F'].map((String item) {
+            children: <String>['A', 'B', 'C', 'D', 'E', 'F'].map<Widget>((String item) {
               return SizedBox(
                 height: 200.0,
                 child: Text(item),
@@ -61,7 +61,7 @@
               width: 600.0,
               child: ListView(
                 physics: const AlwaysScrollableScrollPhysics(),
-                children: <String>['A', 'B', 'C', 'D', 'E', 'F'].map((String item) {
+                children: <String>['A', 'B', 'C', 'D', 'E', 'F'].map<Widget>((String item) {
                   return SizedBox(
                     height: 200.0,
                     child: Text(item),
@@ -362,7 +362,7 @@
           },
           child: ListView(
             physics: const AlwaysScrollableScrollPhysics(),
-            children: <String>['A', 'B', 'C', 'D', 'E', 'F'].map((String item) {
+            children: <String>['A', 'B', 'C', 'D', 'E', 'F'].map<Widget>((String item) {
               return SizedBox(
                 height: 200.0,
                 child: Text(item),
@@ -393,7 +393,7 @@
           child: ListView(
             controller: controller,
             physics: const AlwaysScrollableScrollPhysics(),
-            children: <String>['A', 'B', 'C', 'D', 'E', 'F'].map((String item) {
+            children: <String>['A', 'B', 'C', 'D', 'E', 'F'].map<Widget>((String item) {
               return SizedBox(
                 height: 200.0,
                 child: Text(item),
diff --git a/packages/flutter/test/material/reorderable_list_test.dart b/packages/flutter/test/material/reorderable_list_test.dart
index bc21f79..bab13e2 100644
--- a/packages/flutter/test/material/reorderable_list_test.dart
+++ b/packages/flutter/test/material/reorderable_list_test.dart
@@ -39,7 +39,7 @@
             width: itemHeight * 10,
             child: ReorderableListView(
               header: header,
-              children: listItems.map(listItemToWidget).toList(),
+              children: listItems.map<Widget>(listItemToWidget).toList(),
               scrollDirection: scrollDirection,
               onReorder: onReorder,
             ),
diff --git a/packages/flutter/test/material/tabs_test.dart b/packages/flutter/test/material/tabs_test.dart
index 81dc96b..5eab066 100644
--- a/packages/flutter/test/material/tabs_test.dart
+++ b/packages/flutter/test/material/tabs_test.dart
@@ -78,7 +78,7 @@
       length: tabs.length,
       child: TabBar(
         key: tabBarKey,
-        tabs: tabs.map((String tab) => Tab(text: tab)).toList(),
+        tabs: tabs.map<Widget>((String tab) => Tab(text: tab)).toList(),
         isScrollable: isScrollable,
         indicatorColor: indicatorColor,
       ),
@@ -134,7 +134,7 @@
         appBar: AppBar(
           title: const Text('tabs'),
           bottom: TabBar(
-            tabs: tabs.map((String tab) => Tab(text: tab)).toList(),
+            tabs: tabs.map<Widget>((String tab) => Tab(text: tab)).toList(),
           ),
         ),
         body: const TabBarView(
@@ -295,7 +295,7 @@
           initialIndex: tabs.indexOf(value),
           length: tabs.length,
           child: TabBarView(
-            children: tabs.map((String name) {
+            children: tabs.map<Widget>((String name) {
               return StateMarker(
                 child: Text(name)
               );
@@ -483,11 +483,11 @@
                   title: const Text('tabs'),
                   bottom: TabBar(
                     isScrollable: true,
-                    tabs: tabs.map((String tab) => Tab(text: tab)).toList(),
+                    tabs: tabs.map<Widget>((String tab) => Tab(text: tab)).toList(),
                   ),
                 ),
                 body: TabBarView(
-                  children: tabs.map((String name) => Text('${index++}')).toList(),
+                  children: tabs.map<Widget>((String name) => Text('${index++}')).toList(),
                 ),
               ),
             ),
@@ -550,7 +550,7 @@
             title: const Text('tabs'),
             bottom: TabBar(
               controller: controller,
-              tabs: tabs.map((String tab) => Tab(text: tab)).toList(),
+              tabs: tabs.map<Widget>((String tab) => Tab(text: tab)).toList(),
             ),
           ),
           body: TabBarView(
@@ -609,7 +609,7 @@
             title: const Text('tabs'),
             bottom: TabBar(
               controller: controller,
-              tabs: tabs.map((String tab) => Tab(text: tab)).toList(),
+              tabs: tabs.map<Widget>((String tab) => Tab(text: tab)).toList(),
             ),
           ),
           body: TabBarView(
@@ -1866,7 +1866,7 @@
                 title: const Text('tabs'),
                 bottom: TabBar(
                   controller: controller,
-                  tabs: tabs.map((String tab) => Tab(text: tab)).toList(),
+                  tabs: tabs.map<Widget>((String tab) => Tab(text: tab)).toList(),
                 ),
               ),
               body: TabBarView(
diff --git a/packages/flutter/test/material/text_field_test.dart b/packages/flutter/test/material/text_field_test.dart
index 46979c5..0124ede 100644
--- a/packages/flutter/test/material/text_field_test.dart
+++ b/packages/flutter/test/material/text_field_test.dart
@@ -145,7 +145,7 @@
   }
 
   List<TextSelectionPoint> globalize(Iterable<TextSelectionPoint> points, RenderBox box) {
-    return points.map((TextSelectionPoint point) {
+    return points.map<TextSelectionPoint>((TextSelectionPoint point) {
       return TextSelectionPoint(
         box.localToGlobal(point.point),
         point.direction,
diff --git a/packages/flutter/test/material/theme_test.dart b/packages/flutter/test/material/theme_test.dart
index 8ea5f38..81f060d 100644
--- a/packages/flutter/test/material/theme_test.dart
+++ b/packages/flutter/test/material/theme_test.dart
@@ -388,7 +388,7 @@
     }
 
     for (TextTheme textTheme in <TextTheme>[theme.textTheme, theme.primaryTextTheme, theme.accentTextTheme]) {
-      for (TextStyle style in extractStyles(textTheme).map((TextStyle style) => _TextStyleProxy(style))) {
+      for (TextStyle style in extractStyles(textTheme).map<TextStyle>((TextStyle style) => _TextStyleProxy(style))) {
         expect(style.inherit, false);
         expect(style.color, isNotNull);
         expect(style.fontFamily, isNotNull);
diff --git a/packages/flutter/test/scheduler/scheduler_test.dart b/packages/flutter/test/scheduler/scheduler_test.dart
index 60c5178..75eb269 100644
--- a/packages/flutter/test/scheduler/scheduler_test.dart
+++ b/packages/flutter/test/scheduler/scheduler_test.dart
@@ -94,7 +94,7 @@
   test('2 calls to scheduleWarmUpFrame just schedules it once', () {
     final List<VoidCallback> timerQueueTasks = <VoidCallback>[];
     bool taskExecuted = false;
-    runZoned(
+    runZoned<void>(
       () {
         // Run it twice without processing the queued tasks.
         scheduler.scheduleWarmUpFrame();
diff --git a/packages/flutter/test/widgets/custom_painter_test.dart b/packages/flutter/test/widgets/custom_painter_test.dart
index 52369b9..03455e5 100644
--- a/packages/flutter/test/widgets/custom_painter_test.dart
+++ b/packages/flutter/test/widgets/custom_painter_test.dart
@@ -363,7 +363,7 @@
             TestSemantics.rootChild(
               id: expectedId,
               rect: TestSemantics.fullScreen,
-              actions: allActions.fold(0, (int previous, SemanticsAction action) => previous | action.index),
+              actions: allActions.fold<int>(0, (int previous, SemanticsAction action) => previous | action.index),
             ),
           ]
         ),
diff --git a/packages/flutter/test/widgets/dismissible_test.dart b/packages/flutter/test/widgets/dismissible_test.dart
index 71e19d8..084de05 100644
--- a/packages/flutter/test/widgets/dismissible_test.dart
+++ b/packages/flutter/test/widgets/dismissible_test.dart
@@ -53,7 +53,7 @@
             itemExtent: itemExtent,
             children: <int>[0, 1, 2, 3, 4]
               .where((int i) => !dismissedItems.contains(i))
-              .map(buildDismissibleItem).toList(),
+              .map<Widget>(buildDismissibleItem).toList(),
           ),
         );
       },
diff --git a/packages/flutter/test/widgets/grid_view_test.dart b/packages/flutter/test/widgets/grid_view_test.dart
index 1adc5e7..38b4786 100644
--- a/packages/flutter/test/widgets/grid_view_test.dart
+++ b/packages/flutter/test/widgets/grid_view_test.dart
@@ -29,7 +29,7 @@
         textDirection: TextDirection.ltr,
         child: GridView.count(
           crossAxisCount: 4,
-          children: kStates.map((String state) {
+          children: kStates.map<Widget>((String state) {
             return GestureDetector(
               onTap: () {
                 log.add(state);
@@ -100,7 +100,7 @@
         textDirection: TextDirection.ltr,
         child: GridView.extent(
           maxCrossAxisExtent: 200.0,
-          children: kStates.map((String state) {
+          children: kStates.map<Widget>((String state) {
             return GestureDetector(
               onTap: () {
                 log.add(state);
diff --git a/packages/flutter/test/widgets/heroes_test.dart b/packages/flutter/test/widgets/heroes_test.dart
index 850ae99..45fd966 100644
--- a/packages/flutter/test/widgets/heroes_test.dart
+++ b/packages/flutter/test/widgets/heroes_test.dart
@@ -948,7 +948,7 @@
 
     // One Opacity widget per Hero, only one now has opacity 0.0
     final Iterable<RenderOpacity> renderers = tester.renderObjectList(find.byType(Opacity));
-    final Iterable<double> opacities = renderers.map((RenderOpacity r) => r.opacity);
+    final Iterable<double> opacities = renderers.map<double>((RenderOpacity r) => r.opacity);
     expect(opacities.singleWhere((double opacity) => opacity == 0.0), 0.0);
 
     // Hero BC's flight finishes normally.
diff --git a/packages/flutter/test/widgets/image_headers_test.dart b/packages/flutter/test/widgets/image_headers_test.dart
index a4dc552..c7f8de1 100644
--- a/packages/flutter/test/widgets/image_headers_test.dart
+++ b/packages/flutter/test/widgets/image_headers_test.dart
@@ -18,7 +18,7 @@
   final MockHttpHeaders headers = MockHttpHeaders();
 
   testWidgets('Headers', (WidgetTester tester) async {
-    HttpOverrides.runZoned(() async {
+    HttpOverrides.runZoned<Future<void>>(() async {
       await tester.pumpWidget(Image.network(
         'https://www.example.com/images/frame.png',
         headers: const <String, String>{'flutter': 'flutter'},
diff --git a/packages/flutter/test/widgets/list_view_horizontal_test.dart b/packages/flutter/test/widgets/list_view_horizontal_test.dart
index 8ed0474..fb425be 100644
--- a/packages/flutter/test/widgets/list_view_horizontal_test.dart
+++ b/packages/flutter/test/widgets/list_view_horizontal_test.dart
@@ -19,7 +19,7 @@
           scrollDirection: Axis.horizontal,
           reverse: reverse,
           physics: const BouncingScrollPhysics(),
-          children: items.map((int item) {
+          children: items.map<Widget>((int item) {
             return Container(
               child: Text('$item')
             );
diff --git a/packages/flutter/test/widgets/list_view_vertical_test.dart b/packages/flutter/test/widgets/list_view_vertical_test.dart
index ebc3fe2..617be7e 100644
--- a/packages/flutter/test/widgets/list_view_vertical_test.dart
+++ b/packages/flutter/test/widgets/list_view_vertical_test.dart
@@ -13,7 +13,7 @@
     child: ListView(
       itemExtent: 290.0,
       scrollDirection: Axis.vertical,
-      children: items.map((int item) {
+      children: items.map<Widget>((int item) {
         return Container(
           child: Text('$item')
         );
@@ -74,7 +74,7 @@
           itemExtent: 290.0,
           padding: const EdgeInsets.only(top: 250.0),
           scrollDirection: Axis.vertical,
-          children: items.map((int item) {
+          children: items.map<Widget>((int item) {
             return Container(
               child: Text('$item')
             );
diff --git a/packages/flutter/test/widgets/nested_scroll_view_test.dart b/packages/flutter/test/widgets/nested_scroll_view_test.dart
index fd091f5..b52360b 100644
--- a/packages/flutter/test/widgets/nested_scroll_view_test.dart
+++ b/packages/flutter/test/widgets/nested_scroll_view_test.dart
@@ -389,7 +389,7 @@
                     forceElevated: innerBoxIsScrolled,
                     bottom: TabBar(
                       // These are the widgets to put in each tab in the tab bar.
-                      tabs: _tabs.map((String name) => Tab(text: name)).toList(),
+                      tabs: _tabs.map<Widget>((String name) => Tab(text: name)).toList(),
                     ),
                   ),
                 ),
@@ -397,7 +397,7 @@
             },
             body: TabBarView(
               // These are the contents of the tab views, below the tabs.
-              children: _tabs.map((String name) {
+              children: _tabs.map<Widget>((String name) {
                 return SafeArea(
                   top: false,
                   bottom: false,
diff --git a/packages/flutter/test/widgets/pageable_list_test.dart b/packages/flutter/test/widgets/pageable_list_test.dart
index 670a233..79f2dda 100644
--- a/packages/flutter/test/widgets/pageable_list_test.dart
+++ b/packages/flutter/test/widgets/pageable_list_test.dart
@@ -9,7 +9,7 @@
 
 Size pageSize = const Size(600.0, 300.0);
 const List<int> defaultPages = <int>[0, 1, 2, 3, 4, 5];
-final List<GlobalKey> globalKeys = defaultPages.map((_) => GlobalKey()).toList();
+final List<GlobalKey> globalKeys = defaultPages.map<GlobalKey>((_) => GlobalKey()).toList();
 int currentPage;
 
 Widget buildPage(int page) {
@@ -30,7 +30,7 @@
     scrollDirection: Axis.horizontal,
     reverse: reverse,
     onPageChanged: (int page) { currentPage = page; },
-    children: pages.map(buildPage).toList(),
+    children: pages.map<Widget>(buildPage).toList(),
   );
 
   // The test framework forces the frame to be 800x600, so we need to create
diff --git a/packages/flutter/test/widgets/scrollable_list_hit_testing_test.dart b/packages/flutter/test/widgets/scrollable_list_hit_testing_test.dart
index 862873e..c06da6d 100644
--- a/packages/flutter/test/widgets/scrollable_list_hit_testing_test.dart
+++ b/packages/flutter/test/widgets/scrollable_list_hit_testing_test.dart
@@ -20,7 +20,7 @@
             child: ListView(
               itemExtent: 290.0,
               scrollDirection: Axis.horizontal,
-              children: items.map((int item) {
+              children: items.map<Widget>((int item) {
                 return Container(
                   child: GestureDetector(
                     onTap: () { tapped.add(item); },
@@ -62,7 +62,7 @@
             child: ListView(
               itemExtent: 290.0,
               scrollDirection: Axis.vertical,
-              children: items.map((int item) {
+              children: items.map<Widget>((int item) {
                 return Container(
                   child: GestureDetector(
                     onTap: () { tapped.add(item); },
@@ -104,7 +104,7 @@
         child: ListView(
           itemExtent: 290.0,
           padding: const EdgeInsets.fromLTRB(5.0, 20.0, 15.0, 10.0),
-          children: items.map((int item) {
+          children: items.map<Widget>((int item) {
             return Container(
               child: GestureDetector(
                 onTap: () { tapped.add(item); },
@@ -139,7 +139,7 @@
           itemExtent: 290.0,
           reverse: true,
           padding: const EdgeInsets.fromLTRB(5.0, 20.0, 15.0, 10.0),
-          children: items.map((int item) {
+          children: items.map<Widget>((int item) {
             return Container(
               child: GestureDetector(
                 onTap: () { tapped.add(item); },
@@ -173,7 +173,7 @@
         textDirection: TextDirection.ltr,
         child: ListView(
           itemExtent: 200.0,
-          children: items.map((int item) {
+          children: items.map<Widget>((int item) {
             return Container(
               child: GestureDetector(
                 onTap: () { tapped.add(item); },
diff --git a/packages/flutter/test/widgets/semantics_test.dart b/packages/flutter/test/widgets/semantics_test.dart
index 82ea8d6..c2214c7 100644
--- a/packages/flutter/test/widgets/semantics_test.dart
+++ b/packages/flutter/test/widgets/semantics_test.dart
@@ -427,7 +427,7 @@
         TestSemantics.rootChild(
           id: expectedId,
           rect: TestSemantics.fullScreen,
-          actions: allActions.fold(0, (int previous, SemanticsAction action) => previous | action.index),
+          actions: allActions.fold<int>(0, (int previous, SemanticsAction action) => previous | action.index),
         ),
       ],
     );
diff --git a/packages/flutter/test/widgets/semantics_tester.dart b/packages/flutter/test/widgets/semantics_tester.dart
index 455275a..c10779a 100644
--- a/packages/flutter/test/widgets/semantics_tester.dart
+++ b/packages/flutter/test/widgets/semantics_tester.dart
@@ -325,7 +325,7 @@
     if (rect != null)
       buf.writeln('$indent  rect: $rect,');
     if (transform != null)
-      buf.writeln('$indent  transform:\n${transform.toString().trim().split('\n').map((String line) => '$indent    $line').join('\n')},');
+      buf.writeln('$indent  transform:\n${transform.toString().trim().split('\n').map<String>((String line) => '$indent    $line').join('\n')},');
     buf.writeln('$indent  children: <TestSemantics>[');
     for (TestSemantics child in children) {
       buf.writeln('${child.toString(indentAmount + 2)},');
@@ -403,13 +403,13 @@
       if (textDirection != null && node.textDirection != textDirection)
         return false;
       if (actions != null) {
-        final int expectedActions = actions.fold(0, (int value, SemanticsAction action) => value | action.index);
+        final int expectedActions = actions.fold<int>(0, (int value, SemanticsAction action) => value | action.index);
         final int actualActions = node.getSemanticsData().actions;
         if (expectedActions != actualActions)
           return false;
       }
       if (flags != null) {
-        final int expectedFlags = flags.fold(0, (int value, SemanticsFlag flag) => value | flag.index);
+        final int expectedFlags = flags.fold<int>(0, (int value, SemanticsFlag flag) => value | flag.index);
         final int actualFlags = node.getSemanticsData().flags;
         if (expectedFlags != actualFlags)
           return false;
@@ -503,7 +503,7 @@
   }
 
   static String _tagsToSemanticsTagExpression(Set<SemanticsTag> tags) {
-    return '<SemanticsTag>[${tags.map((SemanticsTag tag) => 'const SemanticsTag(\'${tag.name}\')').join(', ')}]';
+    return '<SemanticsTag>[${tags.map<String>((SemanticsTag tag) => 'const SemanticsTag(\'${tag.name}\')').join(', ')}]';
   }
 
   static String _actionsToSemanticsActionExpression(dynamic actions) {
@@ -565,7 +565,7 @@
     }
 
     buf.write(')');
-    return buf.toString().split('\n').map((String l) => '$indent$l').join('\n');
+    return buf.toString().split('\n').map<String>((String l) => '$indent$l').join('\n');
   }
 }
 
@@ -614,7 +614,7 @@
   }
 
   String _indent(String text) {
-    return text.toString().trimRight().split('\n').map((String line) => '  $line').join('\n');
+    return text.toString().trimRight().split('\n').map<String>((String line) => '  $line').join('\n');
   }
 
   @override
diff --git a/packages/flutter/test/widgets/semantics_tester_generateTestSemanticsExpressionForCurrentSemanticsTree_test.dart b/packages/flutter/test/widgets/semantics_tester_generateTestSemanticsExpressionForCurrentSemanticsTree_test.dart
index 4b92021..730d830 100644
--- a/packages/flutter/test/widgets/semantics_tester_generateTestSemanticsExpressionForCurrentSemanticsTree_test.dart
+++ b/packages/flutter/test/widgets/semantics_tester_generateTestSemanticsExpressionForCurrentSemanticsTree_test.dart
@@ -56,7 +56,7 @@
     final String code = semantics
       .generateTestSemanticsExpressionForCurrentSemanticsTree(DebugSemanticsDumpOrder.inverseHitTest)
       .split('\n')
-      .map((String line) => line.trim())
+      .map<String>((String line) => line.trim())
       .join('\n')
       .trim() + ',';
 
@@ -82,7 +82,7 @@
       expectedCode.indexOf('^' * 12) - 3,
     )
       .split('\n')
-      .map((String line) => line.trim())
+      .map<String>((String line) => line.trim())
       .join('\n')
       .trim();
     semantics.dispose();
diff --git a/packages/flutter/test/widgets/sliver_list_test.dart b/packages/flutter/test/widgets/sliver_list_test.dart
index 9ab78b7..9db3c88 100644
--- a/packages/flutter/test/widgets/sliver_list_test.dart
+++ b/packages/flutter/test/widgets/sliver_list_test.dart
@@ -76,7 +76,7 @@
     expect(find.text('Tile 19'), findsOneWidget);
 
     await tester.pumpWidget(_buildSliverList(
-      items: items.map((int i) => i + 100).toList(),
+      items: items.map<int>((int i) => i + 100).toList(),
       controller: controller,
       itemHeight: itemHeight,
       viewportHeight: viewportHeight,
diff --git a/packages/flutter/test/widgets/slivers_block_global_key_test.dart b/packages/flutter/test/widgets/slivers_block_global_key_test.dart
index 92a2860..2aa787d 100644
--- a/packages/flutter/test/widgets/slivers_block_global_key_test.dart
+++ b/packages/flutter/test/widgets/slivers_block_global_key_test.dart
@@ -34,7 +34,7 @@
         offset: ViewportOffset.fixed(offset),
         slivers: <Widget>[
           SliverList(
-            delegate: SliverChildListDelegate(keys.map((int key) {
+            delegate: SliverChildListDelegate(keys.map<Widget>((int key) {
               return SizedBox(key: GlobalObjectKey(key), height: 100.0, child: GenerationText(key));
             }).toList()),
           ),
diff --git a/packages/flutter_driver/lib/src/driver/driver.dart b/packages/flutter_driver/lib/src/driver/driver.dart
index 7e130d7..5aa1e47 100644
--- a/packages/flutter_driver/lib/src/driver/driver.dart
+++ b/packages/flutter_driver/lib/src/driver/driver.dart
@@ -78,7 +78,7 @@
 
 // See https://github.com/dart-lang/sdk/blob/master/runtime/vm/timeline.cc#L32
 String _timelineStreamsToString(List<TimelineStream> streams) {
-  final String contents = streams.map((TimelineStream stream) {
+  final String contents = streams.map<String>((TimelineStream stream) {
     switch (stream) {
       case TimelineStream.all: return 'all';
       case TimelineStream.api: return 'API';
@@ -428,7 +428,7 @@
   /// The move events are generated at a given [frequency] in Hz (or events per
   /// second). It defaults to 60Hz.
   Future<Null> scroll(SerializableFinder finder, double dx, double dy, Duration duration, { int frequency = 60, Duration timeout }) async {
-    return await _sendCommand(Scroll(finder, dx, dy, duration, frequency, timeout: timeout)).then((Map<String, dynamic> _) => null);
+    return await _sendCommand(Scroll(finder, dx, dy, duration, frequency, timeout: timeout)).then<Null>((Map<String, dynamic> _) => null);
   }
 
   /// Scrolls the Scrollable ancestor of the widget located by [finder]
@@ -439,7 +439,7 @@
   /// then this method may fail because [finder] doesn't actually exist.
   /// The [scrollUntilVisible] method can be used in this case.
   Future<Null> scrollIntoView(SerializableFinder finder, { double alignment = 0.0, Duration timeout }) async {
-    return await _sendCommand(ScrollIntoView(finder, alignment: alignment, timeout: timeout)).then((Map<String, dynamic> _) => null);
+    return await _sendCommand(ScrollIntoView(finder, alignment: alignment, timeout: timeout)).then<Null>((Map<String, dynamic> _) => null);
   }
 
   /// Repeatedly [scroll] the widget located by [scrollable] by [dxScroll] and
@@ -483,7 +483,7 @@
     // the chance to complete if the item is already onscreen; if not, scroll
     // repeatedly until we either find the item or time out.
     bool isVisible = false;
-    waitFor(item, timeout: timeout).then((Null value) { isVisible = true; });
+    waitFor(item, timeout: timeout).then<void>((Null value) { isVisible = true; });
     await Future<Null>.delayed(const Duration(milliseconds: 500));
     while (!isVisible) {
       await scroll(scrollable, dxScroll, dyScroll, const Duration(milliseconds: 100));
diff --git a/packages/flutter_driver/lib/src/driver/timeline.dart b/packages/flutter_driver/lib/src/driver/timeline.dart
index 34be834..6bb3087 100644
--- a/packages/flutter_driver/lib/src/driver/timeline.dart
+++ b/packages/flutter_driver/lib/src/driver/timeline.dart
@@ -129,6 +129,6 @@
 
   // TODO(vegorov): use instance method version of castFrom when it is available.
   return Iterable.castFrom<dynamic, Map<String, dynamic>>(jsonEvents)
-    .map((Map<String, dynamic> eventJson) => TimelineEvent(eventJson))
+    .map<TimelineEvent>((Map<String, dynamic> eventJson) => TimelineEvent(eventJson))
     .toList();
 }
diff --git a/packages/flutter_driver/lib/src/driver/timeline_summary.dart b/packages/flutter_driver/lib/src/driver/timeline_summary.dart
index 09e61de..64e7dc0 100644
--- a/packages/flutter_driver/lib/src/driver/timeline_summary.dart
+++ b/packages/flutter_driver/lib/src/driver/timeline_summary.dart
@@ -98,10 +98,10 @@
       'missed_frame_rasterizer_budget_count': computeMissedFrameRasterizerBudgetCount(),
       'frame_count': countFrames(),
       'frame_build_times': _extractFrameDurations()
-        .map((Duration duration) => duration.inMicroseconds)
+        .map<int>((Duration duration) => duration.inMicroseconds)
         .toList(),
       'frame_rasterizer_times': _extractGpuRasterizerDrawEvents()
-        .map((TimedEvent event) => event.duration.inMicroseconds)
+        .map<int>((TimedEvent event) => event.duration.inMicroseconds)
         .toList(),
     };
   }
@@ -143,7 +143,7 @@
   }
 
   List<Duration> _extractDurations(String name) {
-    return _extractNamedEvents(name).map((TimelineEvent event) => event.duration).toList();
+    return _extractNamedEvents(name).map<Duration>((TimelineEvent event) => event.duration).toList();
   }
 
   /// Extracts timed events that are reported as a pair of begin/end events.
@@ -199,7 +199,7 @@
   List<Duration> _extractFrameDurations() => _extractDurations('Frame');
 
   Iterable<Duration> _extractDuration(Iterable<TimedEvent> events) {
-    return events.map((TimedEvent e) => e.duration);
+    return events.map<Duration>((TimedEvent e) => e.duration);
   }
 }
 
diff --git a/packages/flutter_driver/test/flutter_driver_test.dart b/packages/flutter_driver/test/flutter_driver_test.dart
index d8d8adb..eed263a 100644
--- a/packages/flutter_driver/test/flutter_driver_test.dart
+++ b/packages/flutter_driver/test/flutter_driver_test.dart
@@ -28,7 +28,7 @@
     MockPeer mockPeer;
 
     void expectLogContains(String message) {
-      expect(log.map((LogRecord r) => '$r'), anyElement(contains(message)));
+      expect(log.map<String>((LogRecord r) => '$r'), anyElement(contains(message)));
     }
 
     setUp(() {
diff --git a/packages/flutter_test/lib/src/binding.dart b/packages/flutter_test/lib/src/binding.dart
index 2d47644..80c3fb8 100644
--- a/packages/flutter_test/lib/src/binding.dart
+++ b/packages/flutter_test/lib/src/binding.dart
@@ -228,7 +228,7 @@
   /// Artificially calls dispatchLocaleChanged on the Widget binding,
   /// then flushes microtasks.
   Future<Null> setLocale(String languageCode, String countryCode) {
-    return TestAsyncUtils.guard(() async {
+    return TestAsyncUtils.guard<Null>(() async {
       assert(inTest);
       final Locale locale = Locale(languageCode, countryCode);
       dispatchLocaleChanged(locale);
@@ -243,7 +243,7 @@
   ///
   /// Set to null to use the default surface size.
   Future<Null> setSurfaceSize(Size size) {
-    return TestAsyncUtils.guard(() async {
+    return TestAsyncUtils.guard<Null>(() async {
       assert(inTest);
       if (_surfaceSize == size)
         return null;
@@ -273,7 +273,7 @@
   /// to recursively schedule new microtasks. Will not run any timers scheduled
   /// after this method was invoked, even if they are zero-time timers.
   Future<Null> idle() {
-    return TestAsyncUtils.guard(() {
+    return TestAsyncUtils.guard<Null>(() {
       final Completer<Null> completer = Completer<Null>();
       Timer.run(() {
         completer.complete(null);
@@ -537,7 +537,7 @@
     );
     _parentZone = Zone.current;
     final Zone testZone = _parentZone.fork(specification: errorHandlingZoneSpecification);
-    testZone.runBinary(_runTestBody, testBody, invariantTester)
+    testZone.runBinary<Future<Null>, Future<Null> Function(), VoidCallback>(_runTestBody, testBody, invariantTester)
       .whenComplete(testCompletionHandler);
     timeout?.catchError(handleUncaughtError);
     return testCompleter.future;
@@ -689,7 +689,7 @@
 
   @override
   Future<Null> pump([ Duration duration, EnginePhase newPhase = EnginePhase.sendSemanticsUpdate ]) {
-    return TestAsyncUtils.guard(() {
+    return TestAsyncUtils.guard<Null>(() {
       assert(inTest);
       assert(_clock != null);
       if (duration != null)
@@ -741,7 +741,7 @@
 
     addTime(additionalTime);
 
-    return realAsyncZone.run(() {
+    return realAsyncZone.run<Future<T>>(() {
       _pendingAsyncTasks = Completer<void>();
       return callback().catchError((dynamic exception, StackTrace stack) {
         FlutterError.reportError(FlutterErrorDetails(
@@ -1197,7 +1197,7 @@
     assert(inTest);
     assert(!_expectingFrame);
     assert(_pendingFrame == null);
-    return TestAsyncUtils.guard(() {
+    return TestAsyncUtils.guard<Null>(() {
       if (duration != null) {
         Timer(duration, () {
           _expectingFrame = true;
diff --git a/packages/flutter_test/lib/src/controller.dart b/packages/flutter_test/lib/src/controller.dart
index d2c18d2..0d70e84 100644
--- a/packages/flutter_test/lib/src/controller.dart
+++ b/packages/flutter_test/lib/src/controller.dart
@@ -46,7 +46,7 @@
   Iterable<Widget> get allWidgets {
     TestAsyncUtils.guardSync();
     return allElements
-           .map((Element element) => element.widget);
+           .map<Widget>((Element element) => element.widget);
   }
 
   /// The matching widget in the widget tree.
@@ -137,7 +137,7 @@
     TestAsyncUtils.guardSync();
     return allElements
            .whereType<StatefulElement>()
-           .map((StatefulElement element) => element.state);
+           .map<State>((StatefulElement element) => element.state);
   }
 
   /// The matching state in the widget tree.
@@ -173,7 +173,7 @@
   /// * Use [firstState] if you expect to match several but only want the first.
   Iterable<T> stateList<T extends State>(Finder finder) {
     TestAsyncUtils.guardSync();
-    return finder.evaluate().map((Element element) => _stateOf<T>(element, finder));
+    return finder.evaluate().map<T>((Element element) => _stateOf<T>(element, finder));
   }
 
   T _stateOf<T extends State>(Element element, Finder finder) {
@@ -194,7 +194,7 @@
   Iterable<RenderObject> get allRenderObjects {
     TestAsyncUtils.guardSync();
     return allElements
-           .map((Element element) => element.renderObject);
+           .map<RenderObject>((Element element) => element.renderObject);
   }
 
   /// The render object of the matching widget in the widget tree.
@@ -262,7 +262,7 @@
 
   /// Dispatch a pointer down / pointer up sequence at the given location.
   Future<Null> tapAt(Offset location, { int pointer }) {
-    return TestAsyncUtils.guard(() async {
+    return TestAsyncUtils.guard<Null>(() async {
       final TestGesture gesture = await startGesture(location, pointer: pointer);
       await gesture.up();
       return null;
@@ -293,7 +293,7 @@
   /// Dispatch a pointer down / pointer up sequence at the given location with
   /// a delay of [kLongPressTimeout] + [kPressTimeout] between the two events.
   Future<Null> longPressAt(Offset location, { int pointer }) {
-    return TestAsyncUtils.guard(() async {
+    return TestAsyncUtils.guard<Null>(() async {
       final TestGesture gesture = await startGesture(location, pointer: pointer);
       await pump(kLongPressTimeout + kPressTimeout);
       await gesture.up();
@@ -371,7 +371,7 @@
   }) {
     assert(offset.distance > 0.0);
     assert(speed > 0.0); // speed is pixels/second
-    return TestAsyncUtils.guard(() async {
+    return TestAsyncUtils.guard<Null>(() async {
       final TestPointer testPointer = TestPointer(pointer ?? _getNextPointer());
       final HitTestResult result = hitTestOnBinding(startLocation);
       const int kMoveCount = 50; // Needs to be >= kHistorySize, see _LeastSquaresVelocityTrackerStrategy
@@ -428,7 +428,7 @@
   /// system identifies the gesture as a fling, consider using [flingFrom]
   /// instead.
   Future<Null> dragFrom(Offset startLocation, Offset offset, { int pointer }) {
-    return TestAsyncUtils.guard(() async {
+    return TestAsyncUtils.guard<Null>(() async {
       final TestGesture gesture = await startGesture(startLocation, pointer: pointer);
       assert(gesture != null);
       await gesture.moveBy(offset);
@@ -469,7 +469,7 @@
 
   /// Forwards the given pointer event to the binding.
   Future<Null> sendEventToBinding(PointerEvent event, HitTestResult result) {
-    return TestAsyncUtils.guard(() async {
+    return TestAsyncUtils.guard<Null>(() async {
       binding.dispatchEvent(event, result);
       return null;
     });
diff --git a/packages/flutter_test/lib/src/finders.dart b/packages/flutter_test/lib/src/finders.dart
index 6341190..2d41b03 100644
--- a/packages/flutter_test/lib/src/finders.dart
+++ b/packages/flutter_test/lib/src/finders.dart
@@ -633,7 +633,7 @@
   @override
   Iterable<Element> get allCandidates {
     final Iterable<Element> ancestorElements = ancestor.evaluate();
-    final List<Element> candidates = ancestorElements.expand(
+    final List<Element> candidates = ancestorElements.expand<Element>(
       (Element element) => collectAllElementsFrom(element, skipOffstage: skipOffstage)
     ).toSet().toList();
     if (matchRoot)
diff --git a/packages/flutter_test/lib/src/goldens.dart b/packages/flutter_test/lib/src/goldens.dart
index eeab00b..5ef1493 100644
--- a/packages/flutter_test/lib/src/goldens.dart
+++ b/packages/flutter_test/lib/src/goldens.dart
@@ -181,7 +181,7 @@
       throw test_package.TestFailure('Could not be compared against non-existent file: "$golden"');
     }
     final List<int> goldenBytes = await goldenFile.readAsBytes();
-    return _areListsEqual(imageBytes, goldenBytes);
+    return _areListsEqual<int>(imageBytes, goldenBytes);
   }
 
   @override
diff --git a/packages/flutter_test/lib/src/test_pointer.dart b/packages/flutter_test/lib/src/test_pointer.dart
index 063440e..56f2096 100644
--- a/packages/flutter_test/lib/src/test_pointer.dart
+++ b/packages/flutter_test/lib/src/test_pointer.dart
@@ -142,7 +142,7 @@
     assert(hitTester != null);
     assert(dispatcher != null);
     TestGesture result;
-    return TestAsyncUtils.guard(() async {
+    return TestAsyncUtils.guard<Null>(() async {
       // dispatch down event
       final HitTestResult hitTestResult = hitTester(downLocation);
       final TestPointer testPointer = TestPointer(pointer);
@@ -170,7 +170,7 @@
 
   /// Send a move event moving the pointer to the given location.
   Future<Null> moveTo(Offset location, { Duration timeStamp = Duration.zero }) {
-    return TestAsyncUtils.guard(() {
+    return TestAsyncUtils.guard<Null>(() {
       assert(_pointer._isDown);
       return _dispatcher(_pointer.move(location, timeStamp: timeStamp), _result);
     });
@@ -180,7 +180,7 @@
   ///
   /// The object is no longer usable after this method has been called.
   Future<Null> up() {
-    return TestAsyncUtils.guard(() async {
+    return TestAsyncUtils.guard<Null>(() async {
       assert(_pointer._isDown);
       await _dispatcher(_pointer.up(), _result);
       assert(!_pointer._isDown);
@@ -194,7 +194,7 @@
   ///
   /// The object is no longer usable after this method has been called.
   Future<Null> cancel() {
-    return TestAsyncUtils.guard(() async {
+    return TestAsyncUtils.guard<Null>(() async {
       assert(_pointer._isDown);
       await _dispatcher(_pointer.cancel(), _result);
       assert(!_pointer._isDown);
diff --git a/packages/flutter_test/lib/src/widget_tester.dart b/packages/flutter_test/lib/src/widget_tester.dart
index 4a766fc..bcdee59 100644
--- a/packages/flutter_test/lib/src/widget_tester.dart
+++ b/packages/flutter_test/lib/src/widget_tester.dart
@@ -221,7 +221,7 @@
     Duration duration,
     EnginePhase phase = EnginePhase.sendSemanticsUpdate,
   ]) {
-    return TestAsyncUtils.guard(() {
+    return TestAsyncUtils.guard<Null>(() {
       binding.attachRootWidget(widget);
       binding.scheduleFrame();
       return binding.pump(duration, phase);
@@ -244,7 +244,7 @@
     Duration duration,
     EnginePhase phase = EnginePhase.sendSemanticsUpdate,
   ]) {
-    return TestAsyncUtils.guard(() => binding.pump(duration, phase));
+    return TestAsyncUtils.guard<Null>(() => binding.pump(duration, phase));
   }
 
   /// Repeatedly calls [pump] with the given `duration` until there are no
@@ -292,7 +292,7 @@
       return true;
     }());
     int count = 0;
-    return TestAsyncUtils.guard(() async {
+    return TestAsyncUtils.guard<Null>(() async {
       final DateTime endTime = binding.clock.fromNowBy(timeout);
       do {
         if (binding.clock.now().isAfter(endTime))
@@ -325,7 +325,7 @@
   /// [TestFailure] error being thrown.
   Future<T> runAsync<T>(Future<T> callback(), {
     Duration additionalTime = const Duration(milliseconds: 250),
-  }) => binding.runAsync(callback, additionalTime: additionalTime);
+  }) => binding.runAsync<T>(callback, additionalTime: additionalTime);
 
   /// Whether there are any any transient callbacks scheduled.
   ///
@@ -351,7 +351,7 @@
 
   @override
   Future<Null> sendEventToBinding(PointerEvent event, HitTestResult result) {
-    return TestAsyncUtils.guard(() async {
+    return TestAsyncUtils.guard<Null>(() async {
       binding.dispatchEvent(event, result, source: TestBindingEventSource.test);
       return null;
     });
@@ -485,7 +485,7 @@
   /// Does not run timers. May result in an infinite loop or run out of memory
   /// if microtasks continue to recursively schedule new microtasks.
   Future<Null> idle() {
-    return TestAsyncUtils.guard(() => binding.idle());
+    return TestAsyncUtils.guard<Null>(() => binding.idle());
   }
 
   Set<Ticker> _tickers;
@@ -570,8 +570,8 @@
   /// Tests that just need to add text to widgets like [TextField]
   /// or [TextFormField] only need to call [enterText].
   Future<Null> showKeyboard(Finder finder) async {
-    return TestAsyncUtils.guard(() async {
-      final EditableTextState editable = state(
+    return TestAsyncUtils.guard<Null>(() async {
+      final EditableTextState editable = state<EditableTextState>(
         find.descendant(
           of: finder,
           matching: find.byType(EditableText),
@@ -593,7 +593,7 @@
   /// To just give [finder] the focus without entering any text,
   /// see [showKeyboard].
   Future<Null> enterText(Finder finder, String text) async {
-    return TestAsyncUtils.guard(() async {
+    return TestAsyncUtils.guard<Null>(() async {
       await showKeyboard(finder);
       testTextInput.enterText(text);
       await idle();
@@ -605,7 +605,7 @@
   ///
   /// Will throw an error if there is no back button in the page.
   Future<void> pageBack() async {
-    return TestAsyncUtils.guard(() async {
+    return TestAsyncUtils.guard<void>(() async {
       Finder backButton = find.byTooltip('Back');
       if (backButton.evaluate().isEmpty) {
         backButton = find.byType(CupertinoNavigationBarBackButton);
diff --git a/packages/flutter_test/test/goldens_test.dart b/packages/flutter_test/test/goldens_test.dart
index 147ed2d..0c084ad 100644
--- a/packages/flutter_test/test/goldens_test.dart
+++ b/packages/flutter_test/test/goldens_test.dart
@@ -34,7 +34,7 @@
 
   void test(String description, FutureOr<void> body()) {
     test_package.test(description, () {
-      return io.IOOverrides.runZoned(
+      return io.IOOverrides.runZoned<FutureOr<void>>(
         body,
         createDirectory: (String path) => fs.directory(path),
         createFile: (String path) => fs.file(path),
diff --git a/packages/flutter_test/test/widget_tester_test.dart b/packages/flutter_test/test/widget_tester_test.dart
index ecb5ba0..9249398 100644
--- a/packages/flutter_test/test/widget_tester_test.dart
+++ b/packages/flutter_test/test/widget_tester_test.dart
@@ -24,7 +24,7 @@
       final Completer<void> completer = Completer<void>();
       final Future<void> future = expectLater(null, FakeMatcher(completer));
       String value;
-      future.then((void _) {
+      future.then<void>((void _) {
         value = '123';
       });
       test_package.expect(value, isNull);
@@ -39,7 +39,7 @@
       final Completer<void> completer = Completer<void>();
       final Future<void> future = expectLater(null, FakeMatcher(completer), skip: 'testing skip');
       bool completed = false;
-      future.then((void _) {
+      future.then<void>((void _) {
         completed = true;
       });
       test_package.expect(completed, isFalse);
@@ -498,7 +498,7 @@
 
     testWidgets('maintains existing zone values', (WidgetTester tester) async {
       final Object key = Object();
-      await runZoned(() {
+      await runZoned<Future<void>>(() {
         expect(Zone.current[key], 'abczed');
         return tester.runAsync<void>(() async {
           expect(Zone.current[key], 'abczed');
diff --git a/packages/flutter_tools/bin/fuchsia_asset_builder.dart b/packages/flutter_tools/bin/fuchsia_asset_builder.dart
index e547025..c659f84 100644
--- a/packages/flutter_tools/bin/fuchsia_asset_builder.dart
+++ b/packages/flutter_tools/bin/fuchsia_asset_builder.dart
@@ -77,7 +77,7 @@
     final libfs.File outputFile = libfs.fs.file(libfs.fs.path.join(assetDir, fileName));
     calls.add(writeFile(outputFile, content));
   });
-  await Future.wait(calls);
+  await Future.wait<Null>(calls);
 
   final String outputMan = argResults[_kOptionAssetManifestOut];
   await writeFuchsiaManifest(assets, argResults[_kOptionAsset], outputMan, argResults[_kOptionComponentName]);
diff --git a/packages/flutter_tools/lib/src/android/android_device.dart b/packages/flutter_tools/lib/src/android/android_device.dart
index 3395442..9f9545b 100644
--- a/packages/flutter_tools/lib/src/android/android_device.dart
+++ b/packages/flutter_tools/lib/src/android/android_device.dart
@@ -474,7 +474,7 @@
   @override
   Future<bool> stopApp(ApplicationPackage app) {
     final List<String> command = adbCommandForDevice(<String>['shell', 'am', 'force-stop', app.id]);
-    return runCommandAndStreamOutput(command).then((int exitCode) => exitCode == 0);
+    return runCommandAndStreamOutput(command).then<bool>((int exitCode) => exitCode == 0);
   }
 
   @override
@@ -673,8 +673,8 @@
     runCommand(device.adbCommandForDevice(args)).then<Null>((Process process) {
       _process = process;
       const Utf8Decoder decoder = Utf8Decoder(allowMalformed: true);
-      _process.stdout.transform(decoder).transform(const LineSplitter()).listen(_onLine);
-      _process.stderr.transform(decoder).transform(const LineSplitter()).listen(_onLine);
+      _process.stdout.transform<String>(decoder).transform<String>(const LineSplitter()).listen(_onLine);
+      _process.stderr.transform<String>(decoder).transform<String>(const LineSplitter()).listen(_onLine);
       _process.exitCode.whenComplete(() {
         if (_linesController.hasListener)
           _linesController.close();
diff --git a/packages/flutter_tools/lib/src/android/android_emulator.dart b/packages/flutter_tools/lib/src/android/android_emulator.dart
index d0ea02d..6a0e24d 100644
--- a/packages/flutter_tools/lib/src/android/android_emulator.dart
+++ b/packages/flutter_tools/lib/src/android/android_emulator.dart
@@ -112,13 +112,13 @@
   final Map<String, String> results = <String, String>{};
 
   final Iterable<List<String>> properties = contents
-      .map((String l) => l.trim())
+      .map<String>((String l) => l.trim())
       // Strip blank lines/comments
       .where((String l) => l != '' && !l.startsWith('#'))
       // Discard anything that isn't simple name=value
       .where((String l) => l.contains('='))
       // Split into name/value
-      .map((String l) => l.split('='));
+      .map<List<String>>((String l) => l.split('='));
 
   for (List<String> property in properties) {
     results[property[0].trim()] = property[1].trim();
diff --git a/packages/flutter_tools/lib/src/android/android_sdk.dart b/packages/flutter_tools/lib/src/android/android_sdk.dart
index 72344d2..4c9ea22 100644
--- a/packages/flutter_tools/lib/src/android/android_sdk.dart
+++ b/packages/flutter_tools/lib/src/android/android_sdk.dart
@@ -382,7 +382,7 @@
     }
 
     // Match up platforms with the best corresponding build-tools.
-    _sdkVersions = platforms.map((Directory platformDir) {
+    _sdkVersions = platforms.map<AndroidSdkVersion>((Directory platformDir) {
       final String platformName = platformDir.basename;
       int platformVersion;
 
@@ -394,7 +394,7 @@
           final String buildProps = platformDir.childFile('build.prop').readAsStringSync();
           final String versionString = const LineSplitter()
               .convert(buildProps)
-              .map(_sdkVersionRe.firstMatch)
+              .map<Match>(_sdkVersionRe.firstMatch)
               .firstWhere((Match match) => match != null)
               .group(1);
           platformVersion = int.parse(versionString);
diff --git a/packages/flutter_tools/lib/src/android/android_studio.dart b/packages/flutter_tools/lib/src/android/android_studio.dart
index 9b416d7..4c3dc98 100644
--- a/packages/flutter_tools/lib/src/android/android_studio.dart
+++ b/packages/flutter_tools/lib/src/android/android_studio.dart
@@ -188,7 +188,7 @@
     }
 
     return candidatePaths
-        .map((FileSystemEntity e) => AndroidStudio.fromMacOSBundle(e.path))
+        .map<AndroidStudio>((FileSystemEntity e) => AndroidStudio.fromMacOSBundle(e.path))
         .where((AndroidStudio s) => s != null)
         .toList();
   }
diff --git a/packages/flutter_tools/lib/src/android/android_studio_validator.dart b/packages/flutter_tools/lib/src/android/android_studio_validator.dart
index fd59e4c..3302e94 100644
--- a/packages/flutter_tools/lib/src/android/android_studio_validator.dart
+++ b/packages/flutter_tools/lib/src/android/android_studio_validator.dart
@@ -22,7 +22,7 @@
       validators.add(NoAndroidStudioValidator());
     } else {
       validators.addAll(studios
-          .map((AndroidStudio studio) => AndroidStudioValidator(studio)));
+          .map<DoctorValidator>((AndroidStudio studio) => AndroidStudioValidator(studio)));
     }
     return validators;
   }
@@ -46,11 +46,11 @@
     if (_studio.isValid) {
       type = ValidationType.installed;
       messages.addAll(_studio.validationMessages
-          .map((String m) => ValidationMessage(m)));
+          .map<ValidationMessage>((String m) => ValidationMessage(m)));
     } else {
       type = ValidationType.partial;
       messages.addAll(_studio.validationMessages
-          .map((String m) => ValidationMessage.error(m)));
+          .map<ValidationMessage>((String m) => ValidationMessage.error(m)));
       messages.add(ValidationMessage(
           'Try updating or re-installing Android Studio.'));
       if (_studio.configured != null) {
diff --git a/packages/flutter_tools/lib/src/android/android_workflow.dart b/packages/flutter_tools/lib/src/android/android_workflow.dart
index d3e4285..2a532a0 100644
--- a/packages/flutter_tools/lib/src/android/android_workflow.dart
+++ b/packages/flutter_tools/lib/src/android/android_workflow.dart
@@ -127,7 +127,7 @@
 
     if (validationResult.isNotEmpty) {
       // Android SDK is not functional.
-      messages.addAll(validationResult.map((String message) {
+      messages.addAll(validationResult.map<ValidationMessage>((String message) {
         return ValidationMessage.error(message);
       }));
       messages.add(ValidationMessage(
@@ -200,13 +200,13 @@
     );
     process.stdin.write('n\n');
     final Future<void> output = process.stdout
-      .transform(const Utf8Decoder(allowMalformed: true))
-      .transform(const LineSplitter())
+      .transform<String>(const Utf8Decoder(allowMalformed: true))
+      .transform<String>(const LineSplitter())
       .listen(_onLine)
       .asFuture<void>(null);
     final Future<void> errors = process.stderr
-      .transform(const Utf8Decoder(allowMalformed: true))
-      .transform(const LineSplitter())
+      .transform<String>(const Utf8Decoder(allowMalformed: true))
+      .transform<String>(const LineSplitter())
       .listen(_onLine)
       .asFuture<void>(null);
     try {
diff --git a/packages/flutter_tools/lib/src/asset.dart b/packages/flutter_tools/lib/src/asset.dart
index 22b7b24..5052e5d 100644
--- a/packages/flutter_tools/lib/src/asset.dart
+++ b/packages/flutter_tools/lib/src/asset.dart
@@ -354,7 +354,7 @@
     printStatus(allPackagesList.join(', '));
   }
 
-  final List<String> combinedLicensesList = packageLicenses.keys.map(
+  final List<String> combinedLicensesList = packageLicenses.keys.map<String>(
     (String license) {
       final List<String> packageNames = packageLicenses[license].toList()
        ..sort();
@@ -444,7 +444,7 @@
 }
 
 List<Map<String, dynamic>> _createFontsDescriptor(List<Font> fonts) {
-  return fonts.map((Font font) => font.descriptor).toList();
+  return fonts.map<Map<String, dynamic>>((Font font) => font.descriptor).toList();
 }
 
 // Given an assets directory like this:
diff --git a/packages/flutter_tools/lib/src/base/fingerprint.dart b/packages/flutter_tools/lib/src/base/fingerprint.dart
index fed1cbf..b898ed7 100644
--- a/packages/flutter_tools/lib/src/base/fingerprint.dart
+++ b/packages/flutter_tools/lib/src/base/fingerprint.dart
@@ -97,7 +97,7 @@
 /// See [Fingerprinter].
 class Fingerprint {
   Fingerprint.fromBuildInputs(Map<String, String> properties, Iterable<String> inputPaths) {
-    final Iterable<File> files = inputPaths.map(fs.file);
+    final Iterable<File> files = inputPaths.map<File>(fs.file);
     final Iterable<File> missingInputs = files.where((File file) => !file.existsSync());
     if (missingInputs.isNotEmpty)
       throw ArgumentError('Missing input files:\n' + missingInputs.join('\n'));
@@ -179,7 +179,7 @@
   return dependencies
       .replaceAllMapped(_separatorExpr, (Match match) => '${match.group(1)}\n')
       .split('\n')
-      .map((String path) => path.replaceAllMapped(_escapeExpr, (Match match) => match.group(1)).trim())
+      .map<String>((String path) => path.replaceAllMapped(_escapeExpr, (Match match) => match.group(1)).trim())
       .where((String path) => path.isNotEmpty)
       .toSet();
 }
diff --git a/packages/flutter_tools/lib/src/base/io.dart b/packages/flutter_tools/lib/src/base/io.dart
index fb9be51..70ca4fe 100644
--- a/packages/flutter_tools/lib/src/base/io.dart
+++ b/packages/flutter_tools/lib/src/base/io.dart
@@ -127,7 +127,7 @@
 
   @override
   Stream<ProcessSignal> watch() {
-    return _delegate.watch().map((io.ProcessSignal signal) => this);
+    return _delegate.watch().map<ProcessSignal>((io.ProcessSignal signal) => this);
   }
 
   @override
diff --git a/packages/flutter_tools/lib/src/base/logger.dart b/packages/flutter_tools/lib/src/base/logger.dart
index de9eabf..dd6f0a1 100644
--- a/packages/flutter_tools/lib/src/base/logger.dart
+++ b/packages/flutter_tools/lib/src/base/logger.dart
@@ -112,7 +112,7 @@
       message = terminal.color(message, color);
     if (indent != null && indent > 0) {
       message = LineSplitter.split(message)
-          .map((String line) => ' ' * indent + line)
+          .map<String>((String line) => ' ' * indent + line)
           .join('\n');
     }
     if (newline != false)
diff --git a/packages/flutter_tools/lib/src/base/os.dart b/packages/flutter_tools/lib/src/base/os.dart
index 8c3b30d..54f5964 100644
--- a/packages/flutter_tools/lib/src/base/os.dart
+++ b/packages/flutter_tools/lib/src/base/os.dart
@@ -92,7 +92,7 @@
     if (result.exitCode != 0)
       return const <File>[];
     final String stdout = result.stdout;
-    return stdout.trim().split('\n').map((String path) => fs.file(path.trim())).toList();
+    return stdout.trim().split('\n').map<File>((String path) => fs.file(path.trim())).toList();
   }
 
   @override
@@ -166,7 +166,7 @@
       return const <File>[];
     final List<String> lines = result.stdout.trim().split('\n');
     if (all)
-      return lines.map((String path) => fs.file(path.trim())).toList();
+      return lines.map<File>((String path) => fs.file(path.trim())).toList();
     return <File>[fs.file(lines.first.trim())];
   }
 
diff --git a/packages/flutter_tools/lib/src/base/process.dart b/packages/flutter_tools/lib/src/base/process.dart
index caf6349..29029d4 100644
--- a/packages/flutter_tools/lib/src/base/process.dart
+++ b/packages/flutter_tools/lib/src/base/process.dart
@@ -137,8 +137,8 @@
     environment: environment
   );
   final StreamSubscription<String> stdoutSubscription = process.stdout
-    .transform(utf8.decoder)
-    .transform(const LineSplitter())
+    .transform<String>(utf8.decoder)
+    .transform<String>(const LineSplitter())
     .where((String line) => filter == null ? true : filter.hasMatch(line))
     .listen((String line) {
       if (mapFunction != null)
@@ -152,8 +152,8 @@
       }
     });
   final StreamSubscription<String> stderrSubscription = process.stderr
-    .transform(utf8.decoder)
-    .transform(const LineSplitter())
+    .transform<String>(utf8.decoder)
+    .transform<String>(const LineSplitter())
     .where((String line) => filter == null ? true : filter.hasMatch(line))
     .listen((String line) {
       if (mapFunction != null)
diff --git a/packages/flutter_tools/lib/src/base/terminal.dart b/packages/flutter_tools/lib/src/base/terminal.dart
index 8e40c59..65a5a46 100644
--- a/packages/flutter_tools/lib/src/base/terminal.dart
+++ b/packages/flutter_tools/lib/src/base/terminal.dart
@@ -107,7 +107,7 @@
   ///
   /// Useful when the console is in [singleCharMode].
   Stream<String> get onCharInput {
-    _broadcastStdInString ??= io.stdin.transform(const AsciiDecoder(allowInvalid: true)).asBroadcastStream();
+    _broadcastStdInString ??= io.stdin.transform<String>(const AsciiDecoder(allowInvalid: true)).asBroadcastStream();
     return _broadcastStdInString;
   }
 
diff --git a/packages/flutter_tools/lib/src/base/utils.dart b/packages/flutter_tools/lib/src/base/utils.dart
index 102a0ec..ee485de 100644
--- a/packages/flutter_tools/lib/src/base/utils.dart
+++ b/packages/flutter_tools/lib/src/base/utils.dart
@@ -202,7 +202,7 @@
   final Map<String, String> values = <String, String>{};
 
   void writeContents(File file) {
-    file.writeAsStringSync(values.keys.map((String key) {
+    file.writeAsStringSync(values.keys.map<String>((String key) {
       return '$key=${values[key]}';
     }).join('\n'));
   }
diff --git a/packages/flutter_tools/lib/src/bundle.dart b/packages/flutter_tools/lib/src/bundle.dart
index db1b569..4a531b2 100644
--- a/packages/flutter_tools/lib/src/bundle.dart
+++ b/packages/flutter_tools/lib/src/bundle.dart
@@ -193,8 +193,8 @@
     bundleDir.deleteSync(recursive: true);
   bundleDir.createSync(recursive: true);
 
-  await Future.wait(
-      assetEntries.entries.map((MapEntry<String, DevFSContent> entry) async {
+  await Future.wait<void>(
+      assetEntries.entries.map<Future<void>>((MapEntry<String, DevFSContent> entry) async {
     final File file = fs.file(fs.path.join(bundleDir.path, entry.key));
     file.parent.createSync(recursive: true);
     await file.writeAsBytes(await entry.value.contentsAsBytes());
diff --git a/packages/flutter_tools/lib/src/cache.dart b/packages/flutter_tools/lib/src/cache.dart
index 8e2325c..8ab311c 100644
--- a/packages/flutter_tools/lib/src/cache.dart
+++ b/packages/flutter_tools/lib/src/cache.dart
@@ -560,7 +560,7 @@
 @visibleForTesting
 String flattenNameSubdirs(Uri url) {
   final List<String> pieces = <String>[url.host]..addAll(url.pathSegments);
-  final Iterable<String> convertedPieces = pieces.map(_flattenNameNoSubdirs);
+  final Iterable<String> convertedPieces = pieces.map<String>(_flattenNameNoSubdirs);
   return fs.path.joinAll(convertedPieces);
 }
 
diff --git a/packages/flutter_tools/lib/src/commands/analyze_once.dart b/packages/flutter_tools/lib/src/commands/analyze_once.dart
index ae14c97..3d181ad 100644
--- a/packages/flutter_tools/lib/src/commands/analyze_once.dart
+++ b/packages/flutter_tools/lib/src/commands/analyze_once.dart
@@ -92,7 +92,7 @@
 
     await server.start();
     // Completing the future in the callback can't fail.
-    server.onExit.then((int exitCode) { // ignore: unawaited_futures
+    server.onExit.then<void>((int exitCode) { // ignore: unawaited_futures
       if (!analysisCompleter.isCompleted) {
         analysisCompleter.completeError('analysis server exited: $exitCode');
       }
diff --git a/packages/flutter_tools/lib/src/commands/build_aot.dart b/packages/flutter_tools/lib/src/commands/build_aot.dart
index fb07c23..dc5a79f 100644
--- a/packages/flutter_tools/lib/src/commands/build_aot.dart
+++ b/packages/flutter_tools/lib/src/commands/build_aot.dart
@@ -35,8 +35,8 @@
       )
       ..addMultiOption('ios-arch',
         splitCommas: true,
-        defaultsTo: defaultIOSArchs.map(getNameForIOSArch),
-        allowed: IOSArch.values.map(getNameForIOSArch),
+        defaultsTo: defaultIOSArchs.map<String>(getNameForIOSArch),
+        allowed: IOSArch.values.map<String>(getNameForIOSArch),
         help: 'iOS architectures to build.',
       )
       ..addMultiOption(FlutterOptions.kExtraFrontEndOptions,
@@ -112,14 +112,14 @@
             outputPath: outputPath,
             buildSharedLibrary: false,
             extraGenSnapshotOptions: argResults[FlutterOptions.kExtraGenSnapshotOptions],
-          ).then((int buildExitCode) {
+          ).then<int>((int buildExitCode) {
             return buildExitCode;
           });
         });
 
         // Merge arch-specific App.frameworks into a multi-arch App.framework.
-        if ((await Future.wait(exitCodes.values)).every((int buildExitCode) => buildExitCode == 0)) {
-          final Iterable<String> dylibs = iosBuilds.values.map((String outputDir) => fs.path.join(outputDir, 'App.framework', 'App'));
+        if ((await Future.wait<int>(exitCodes.values)).every((int buildExitCode) => buildExitCode == 0)) {
+          final Iterable<String> dylibs = iosBuilds.values.map<String>((String outputDir) => fs.path.join(outputDir, 'App.framework', 'App'));
           fs.directory(fs.path.join(outputPath, 'App.framework'))..createSync();
           await runCheckedAsync(<String>['lipo']
             ..addAll(dylibs)
diff --git a/packages/flutter_tools/lib/src/commands/config.dart b/packages/flutter_tools/lib/src/commands/config.dart
index a69655e..2d60e8a 100644
--- a/packages/flutter_tools/lib/src/commands/config.dart
+++ b/packages/flutter_tools/lib/src/commands/config.dart
@@ -47,7 +47,7 @@
   @override
   String get usageFooter {
     // List all config settings.
-    String values = config.keys.map((String key) {
+    String values = config.keys.map<String>((String key) {
       return '  $key: ${config.getValue(key)}';
     }).join('\n');
     if (values.isNotEmpty)
diff --git a/packages/flutter_tools/lib/src/commands/daemon.dart b/packages/flutter_tools/lib/src/commands/daemon.dart
index 6189f2c..18d38bc 100644
--- a/packages/flutter_tools/lib/src/commands/daemon.dart
+++ b/packages/flutter_tools/lib/src/commands/daemon.dart
@@ -603,7 +603,7 @@
 
   _DeviceEventHandler _onDeviceEvent(String eventName) {
     return (Device device) {
-      _serializeDeviceEvents = _serializeDeviceEvents.then((_) async {
+      _serializeDeviceEvents = _serializeDeviceEvents.then<Null>((_) async {
         sendEvent(eventName, await _deviceToMap(device));
       });
     };
@@ -679,10 +679,10 @@
 }
 
 Stream<Map<String, dynamic>> get stdinCommandStream => stdin
-  .transform(utf8.decoder)
-  .transform(const LineSplitter())
+  .transform<String>(utf8.decoder)
+  .transform<String>(const LineSplitter())
   .where((String line) => line.startsWith('[{') && line.endsWith('}]'))
-  .map((String line) {
+  .map<Map<String, dynamic>>((String line) {
     line = line.substring(1, line.length - 1);
     return json.decode(line);
   });
@@ -829,7 +829,7 @@
 
   Future<List<Map<String, dynamic>>> getEmulators([Map<String, dynamic> args]) async {
     final List<Emulator> list = await emulators.getAllAvailableEmulators();
-    return list.map(_emulatorToMap).toList();
+    return list.map<Map<String, dynamic>>(_emulatorToMap).toList();
   }
 
   Future<Null> launch(Map<String, dynamic> args) async {
diff --git a/packages/flutter_tools/lib/src/commands/drive.dart b/packages/flutter_tools/lib/src/commands/drive.dart
index 419371a..dcccb09 100644
--- a/packages/flutter_tools/lib/src/commands/drive.dart
+++ b/packages/flutter_tools/lib/src/commands/drive.dart
@@ -206,7 +206,7 @@
     return null;
   } else if (devices.length > 1) {
     printStatus('Found multiple connected devices:');
-    printStatus(devices.map((Device d) => '  - ${d.name}\n').join(''));
+    printStatus(devices.map<String>((Device d) => '  - ${d.name}\n').join(''));
   }
   printStatus('Using device ${devices.first.name}.');
   return devices.first;
diff --git a/packages/flutter_tools/lib/src/commands/fuchsia_reload.dart b/packages/flutter_tools/lib/src/commands/fuchsia_reload.dart
index fab2988..3979beb 100644
--- a/packages/flutter_tools/lib/src/commands/fuchsia_reload.dart
+++ b/packages/flutter_tools/lib/src/commands/fuchsia_reload.dart
@@ -120,7 +120,7 @@
     // Wrap everything in try/finally to make sure we kill the ssh processes
     // doing the port forwarding.
     try {
-      final List<int> servicePorts = forwardedPorts.map(
+      final List<int> servicePorts = forwardedPorts.map<int>(
           (_PortForwarder pf) => pf.port).toList();
 
       if (_list) {
@@ -145,10 +145,10 @@
 
       // Set up a device and hot runner and attach the hot runner to the first
       // vm service we found.
-      final List<String> fullAddresses = targetPorts.map(
+      final List<String> fullAddresses = targetPorts.map<String>(
         (int p) => '$ipv4Loopback:$p'
       ).toList();
-      final List<Uri> observatoryUris = fullAddresses.map(
+      final List<Uri> observatoryUris = fullAddresses.map<Uri>(
         (String a) => Uri.parse('http://$a')
       ).toList();
       final FuchsiaDevice device = FuchsiaDevice(
@@ -168,7 +168,7 @@
       printStatus('Connecting to $_modName');
       await hotRunner.attach(viewFilter: isolateName);
     } finally {
-      await Future.wait(forwardedPorts.map((_PortForwarder pf) => pf.stop()));
+      await Future.wait<Null>(forwardedPorts.map<Future<Null>>((_PortForwarder pf) => pf.stop()));
     }
   }
 
@@ -474,11 +474,11 @@
     printTrace("_PortForwarder running '${command.join(' ')}'");
     final Process process = await processManager.start(command);
     process.stderr
-        .transform(utf8.decoder)
-        .transform(const LineSplitter())
+        .transform<String>(utf8.decoder)
+        .transform<String>(const LineSplitter())
         .listen((String data) { printTrace(data); });
     // Best effort to print the exit code.
-    process.exitCode.then((int c) { // ignore: unawaited_futures
+    process.exitCode.then<void>((int c) { // ignore: unawaited_futures
       printTrace("'${command.join(' ')}' exited with exit code $c");
     });
     printTrace('Set up forwarding from $localPort to $address:$remotePort');
diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart
index 1f3bbc7..36efd98 100644
--- a/packages/flutter_tools/lib/src/commands/run.dart
+++ b/packages/flutter_tools/lib/src/commands/run.dart
@@ -344,7 +344,7 @@
       fs.file(pidFile).writeAsStringSync(pid.toString());
     }
 
-    final List<FlutterDevice> flutterDevices = devices.map((Device device) {
+    final List<FlutterDevice> flutterDevices = devices.map<FlutterDevice>((Device device) {
       return FlutterDevice(
         device,
         trackWidgetCreation: argResults['track-widget-creation'],
@@ -392,7 +392,7 @@
     // Do not add more operations to the future.
     final Completer<void> appStartedTimeRecorder = Completer<void>.sync();
     // This callback can't throw.
-    appStartedTimeRecorder.future.then( // ignore: unawaited_futures
+    appStartedTimeRecorder.future.then<void>( // ignore: unawaited_futures
       (_) { appStartedTime = clock.now(); }
     );
 
diff --git a/packages/flutter_tools/lib/src/compile.dart b/packages/flutter_tools/lib/src/compile.dart
index c2b0352..26c239a 100644
--- a/packages/flutter_tools/lib/src/compile.dart
+++ b/packages/flutter_tools/lib/src/compile.dart
@@ -179,11 +179,11 @@
     final _StdoutHandler _stdoutHandler = _StdoutHandler();
 
     server.stderr
-      .transform(utf8.decoder)
+      .transform<String>(utf8.decoder)
       .listen((String message) { printError(message); });
     server.stdout
-      .transform(utf8.decoder)
-      .transform(const LineSplitter())
+      .transform<String>(utf8.decoder)
+      .transform<String>(const LineSplitter())
       .listen(_stdoutHandler.handler);
     final int exitCode = await server.exitCode;
     if (exitCode == 0) {
@@ -372,8 +372,8 @@
     printTrace(command.join(' '));
     _server = await processManager.start(command);
     _server.stdout
-      .transform(utf8.decoder)
-      .transform(const LineSplitter())
+      .transform<String>(utf8.decoder)
+      .transform<String>(const LineSplitter())
       .listen(
         _stdoutHandler.handler,
         onDone: () {
@@ -385,8 +385,8 @@
         });
 
     _server.stderr
-      .transform(utf8.decoder)
-      .transform(const LineSplitter())
+      .transform<String>(utf8.decoder)
+      .transform<String>(const LineSplitter())
       .listen((String message) { printError(message); });
 
     _server.stdin.writeln('compile $scriptFilename');
diff --git a/packages/flutter_tools/lib/src/dart/analysis.dart b/packages/flutter_tools/lib/src/dart/analysis.dart
index 0815190..481e4cb 100644
--- a/packages/flutter_tools/lib/src/dart/analysis.dart
+++ b/packages/flutter_tools/lib/src/dart/analysis.dart
@@ -43,11 +43,11 @@
     _process.exitCode.whenComplete(() => _process = null); // ignore: unawaited_futures
 
     final Stream<String> errorStream =
-        _process.stderr.transform(utf8.decoder).transform(const LineSplitter());
+        _process.stderr.transform<String>(utf8.decoder).transform<String>(const LineSplitter());
     errorStream.listen(printError);
 
     final Stream<String> inStream =
-        _process.stdout.transform(utf8.decoder).transform(const LineSplitter());
+        _process.stdout.transform<String>(utf8.decoder).transform<String>(const LineSplitter());
     inStream.listen(_handleServerResponse);
 
     // Available options (many of these are obsolete):
diff --git a/packages/flutter_tools/lib/src/devfs.dart b/packages/flutter_tools/lib/src/devfs.dart
index 0594742..3dd8819 100644
--- a/packages/flutter_tools/lib/src/devfs.dart
+++ b/packages/flutter_tools/lib/src/devfs.dart
@@ -47,7 +47,7 @@
   Stream<List<int>> contentsAsStream();
 
   Stream<List<int>> contentsAsCompressedStream() {
-    return contentsAsStream().transform(gzip.encoder);
+    return contentsAsStream().transform<List<int>>(gzip.encoder);
   }
 
   /// Return the list of files this content depends on.
@@ -445,7 +445,7 @@
       if (!content._exists) {
         final Future<Map<String, dynamic>> operation =
             _operations.deleteFile(fsName, deviceUri)
-            .then((dynamic v) => v?.cast<String,dynamic>());
+            .then<Map<String, dynamic>>((dynamic v) => v?.cast<String,dynamic>());
         if (operation != null)
           _pendingOperations.add(operation);
         toRemove.add(deviceUri);
@@ -458,7 +458,7 @@
     if (toRemove.isNotEmpty) {
       printTrace('Removing deleted files');
       toRemove.forEach(_entries.remove);
-      await Future.wait(_pendingOperations);
+      await Future.wait<Map<String, dynamic>>(_pendingOperations);
       _pendingOperations.clear();
     }
 
@@ -542,11 +542,11 @@
         dirtyEntries.forEach((Uri deviceUri, DevFSContent content) {
           final Future<Map<String, dynamic>> operation =
               _operations.writeFile(fsName, deviceUri, content)
-                  .then((dynamic v) => v?.cast<String, dynamic>());
+                  .then<Map<String, dynamic>>((dynamic v) => v?.cast<String, dynamic>());
           if (operation != null)
             _pendingOperations.add(operation);
         });
-        await Future.wait(_pendingOperations, eagerError: true);
+        await Future.wait<Map<String, dynamic>>(_pendingOperations, eagerError: true);
         _pendingOperations.clear();
       }
     }
diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart
index 61ff0ab..29f5c27 100644
--- a/packages/flutter_tools/lib/src/device.dart
+++ b/packages/flutter_tools/lib/src/device.dart
@@ -315,14 +315,14 @@
 
     // Calculate column widths
     final List<int> indices = List<int>.generate(table[0].length - 1, (int i) => i);
-    List<int> widths = indices.map((int i) => 0).toList();
+    List<int> widths = indices.map<int>((int i) => 0).toList();
     for (List<String> row in table) {
-      widths = indices.map((int i) => math.max(widths[i], row[i].length)).toList();
+      widths = indices.map<int>((int i) => math.max(widths[i], row[i].length)).toList();
     }
 
     // Join columns into lines of text
     for (List<String> row in table) {
-      yield indices.map((int i) => row[i].padRight(widths[i])).join(' • ') + ' • ${row.last}';
+      yield indices.map<String>((int i) => row[i].padRight(widths[i])).join(' • ') + ' • ${row.last}';
     }
   }
 
diff --git a/packages/flutter_tools/lib/src/doctor.dart b/packages/flutter_tools/lib/src/doctor.dart
index 1c625b4..d0fcf2f 100644
--- a/packages/flutter_tools/lib/src/doctor.dart
+++ b/packages/flutter_tools/lib/src/doctor.dart
@@ -569,9 +569,9 @@
 
     try {
       final Iterable<Directory> installDirs = installPaths
-              .map((String installPath) => fs.directory(installPath))
-              .map((Directory dir) => dir.existsSync() ? dir.listSync() : <FileSystemEntity>[])
-              .expand((List<FileSystemEntity> mappedDirs) => mappedDirs)
+              .map<Directory>((String installPath) => fs.directory(installPath))
+              .map<List<FileSystemEntity>>((Directory dir) => dir.existsSync() ? dir.listSync() : <FileSystemEntity>[])
+              .expand<FileSystemEntity>((List<FileSystemEntity> mappedDirs) => mappedDirs)
               .whereType<Directory>();
       for (Directory dir in installDirs) {
         checkForIntelliJ(dir);
@@ -626,13 +626,13 @@
     if (devices.isEmpty) {
       final List<String> diagnostics = await deviceManager.getDeviceDiagnostics();
       if (diagnostics.isNotEmpty) {
-        messages = diagnostics.map((String message) => ValidationMessage(message)).toList();
+        messages = diagnostics.map<ValidationMessage>((String message) => ValidationMessage(message)).toList();
       } else {
         messages = <ValidationMessage>[ValidationMessage.hint('No devices available')];
       }
     } else {
       messages = await Device.descriptions(devices)
-          .map((String msg) => ValidationMessage(msg)).toList();
+          .map<ValidationMessage>((String msg) => ValidationMessage(msg)).toList();
     }
 
     if (devices.isEmpty) {
diff --git a/packages/flutter_tools/lib/src/emulator.dart b/packages/flutter_tools/lib/src/emulator.dart
index c40497c..42e63fe 100644
--- a/packages/flutter_tools/lib/src/emulator.dart
+++ b/packages/flutter_tools/lib/src/emulator.dart
@@ -54,7 +54,7 @@
   /// Return the list of all available emulators.
   Future<List<Emulator>> getAllAvailableEmulators() async {
     final List<Emulator> emulators = <Emulator>[];
-    await Future.forEach(_platformDiscoverers, (EmulatorDiscovery discoverer) async {
+    await Future.forEach<EmulatorDiscovery>(_platformDiscoverers, (EmulatorDiscovery discoverer) async {
       emulators.addAll(await discoverer.emulators);
     });
     return emulators;
@@ -69,7 +69,7 @@
       // so we can keep adding suffixes until we miss.
       final List<Emulator> all = await getAllAvailableEmulators();
       final Set<String> takenNames = all
-          .map((Emulator e) => e.id)
+          .map<String>((Emulator e) => e.id)
           .where((String id) => id.startsWith(autoName))
           .toSet();
       int suffix = 1;
@@ -176,8 +176,8 @@
         .toList();
 
     final List<int> availableApiVersions = availableIDs
-        .map((String id) => androidApiVersion.firstMatch(id).group(1))
-        .map((String apiVersion) => int.parse(apiVersion))
+        .map<String>((String id) => androidApiVersion.firstMatch(id).group(1))
+        .map<int>((String apiVersion) => int.parse(apiVersion))
         .toList();
 
     // Get the highest Android API version or whats left
@@ -253,21 +253,21 @@
 
     // Calculate column widths
     final List<int> indices = List<int>.generate(table[0].length - 1, (int i) => i);
-    List<int> widths = indices.map((int i) => 0).toList();
+    List<int> widths = indices.map<int>((int i) => 0).toList();
     for (List<String> row in table) {
-      widths = indices.map((int i) => math.max(widths[i], row[i].length)).toList();
+      widths = indices.map<int>((int i) => math.max(widths[i], row[i].length)).toList();
     }
 
     // Join columns into lines of text
     final RegExp whiteSpaceAndDots = RegExp(r'[•\s]+$');
     return table
-        .map((List<String> row) {
+        .map<String>((List<String> row) {
           return indices
-                  .map((int i) => row[i].padRight(widths[i]))
+                  .map<String>((int i) => row[i].padRight(widths[i]))
                   .join(' • ') +
               ' • ${row.last}';
         })
-        .map((String line) => line.replaceAll(whiteSpaceAndDots, ''))
+        .map<String>((String line) => line.replaceAll(whiteSpaceAndDots, ''))
         .toList();
   }
 
diff --git a/packages/flutter_tools/lib/src/flutter_manifest.dart b/packages/flutter_tools/lib/src/flutter_manifest.dart
index 9e937f4..6fa8efb 100644
--- a/packages/flutter_tools/lib/src/flutter_manifest.dart
+++ b/packages/flutter_tools/lib/src/flutter_manifest.dart
@@ -224,7 +224,7 @@
   Map<String, dynamic> get descriptor {
     return <String, dynamic>{
       'family': familyName,
-      'fonts': fontAssets.map((FontAsset a) => a.descriptor).toList(),
+      'fonts': fontAssets.map<Map<String, dynamic>>((FontAsset a) => a.descriptor).toList(),
     };
   }
 
diff --git a/packages/flutter_tools/lib/src/ios/devices.dart b/packages/flutter_tools/lib/src/ios/devices.dart
index 111b654..d9f4e26 100644
--- a/packages/flutter_tools/lib/src/ios/devices.dart
+++ b/packages/flutter_tools/lib/src/ios/devices.dart
@@ -477,8 +477,8 @@
   void _start() {
     iMobileDevice.startLogger().then<Null>((Process process) {
       _process = process;
-      _process.stdout.transform(utf8.decoder).transform(const LineSplitter()).listen(_newLineHandler());
-      _process.stderr.transform(utf8.decoder).transform(const LineSplitter()).listen(_newLineHandler());
+      _process.stdout.transform<String>(utf8.decoder).transform<String>(const LineSplitter()).listen(_newLineHandler());
+      _process.stderr.transform<String>(utf8.decoder).transform<String>(const LineSplitter()).listen(_newLineHandler());
       _process.exitCode.whenComplete(() {
         if (_linesController.hasListener)
           _linesController.close();
diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart
index d86bf9b..d77a41d 100644
--- a/packages/flutter_tools/lib/src/ios/mac.dart
+++ b/packages/flutter_tools/lib/src/ios/mac.dart
@@ -662,7 +662,7 @@
 
 void _copyServiceDefinitionsManifest(List<Map<String, String>> services, File manifest) {
   printTrace("Creating service definitions manifest at '${manifest.path}'");
-  final List<Map<String, String>> jsonServices = services.map((Map<String, String> service) => <String, String>{
+  final List<Map<String, String>> jsonServices = services.map<Map<String, String>>((Map<String, String> service) => <String, String>{
     'name': service['name'],
     // Since we have already moved it to the Frameworks directory. Strip away
     // the directory and basenames.
diff --git a/packages/flutter_tools/lib/src/ios/simulators.dart b/packages/flutter_tools/lib/src/ios/simulators.dart
index e4ba830..77dd9d4 100644
--- a/packages/flutter_tools/lib/src/ios/simulators.dart
+++ b/packages/flutter_tools/lib/src/ios/simulators.dart
@@ -46,7 +46,7 @@
     if (!xcode.isInstalledAndMeetsVersionCheck)
       return <IOSSimulator>[];
 
-    return SimControl.instance.getConnectedDevices().map((SimDevice device) {
+    return SimControl.instance.getConnectedDevices().map<IOSSimulator>((SimDevice device) {
       return IOSSimulator(device.udid, name: device.name, category: device.category);
     }).toList();
   }
@@ -339,7 +339,7 @@
   }
 
   Future<bool> _applicationIsInstalledAndRunning(ApplicationPackage app) async {
-    final List<bool> criteria = await Future.wait(<Future<bool>>[
+    final List<bool> criteria = await Future.wait<bool>(<Future<bool>>[
       isAppInstalled(app),
       exitsHappyAsync(<String>['/usr/bin/killall', 'Runner']),
     ]);
@@ -510,15 +510,15 @@
     // Device log.
     await device.ensureLogsExists();
     _deviceProcess = await launchDeviceLogTool(device);
-    _deviceProcess.stdout.transform(utf8.decoder).transform(const LineSplitter()).listen(_onDeviceLine);
-    _deviceProcess.stderr.transform(utf8.decoder).transform(const LineSplitter()).listen(_onDeviceLine);
+    _deviceProcess.stdout.transform<String>(utf8.decoder).transform<String>(const LineSplitter()).listen(_onDeviceLine);
+    _deviceProcess.stderr.transform<String>(utf8.decoder).transform<String>(const LineSplitter()).listen(_onDeviceLine);
 
     // Track system.log crashes.
     // ReportCrash[37965]: Saved crash report for FlutterRunner[37941]...
     _systemProcess = await launchSystemLogTool(device);
     if (_systemProcess != null) {
-      _systemProcess.stdout.transform(utf8.decoder).transform(const LineSplitter()).listen(_onSystemLine);
-      _systemProcess.stderr.transform(utf8.decoder).transform(const LineSplitter()).listen(_onSystemLine);
+      _systemProcess.stdout.transform<String>(utf8.decoder).transform<String>(const LineSplitter()).listen(_onSystemLine);
+      _systemProcess.stderr.transform<String>(utf8.decoder).transform<String>(const LineSplitter()).listen(_onSystemLine);
     }
 
     // We don't want to wait for the process or its callback. Best effort
@@ -629,8 +629,8 @@
 }
 
 int compareIosVersions(String v1, String v2) {
-  final List<int> v1Fragments = v1.split('.').map(int.parse).toList();
-  final List<int> v2Fragments = v2.split('.').map(int.parse).toList();
+  final List<int> v1Fragments = v1.split('.').map<int>(int.parse).toList();
+  final List<int> v2Fragments = v2.split('.').map<int>(int.parse).toList();
 
   int i = 0;
   while (i < v1Fragments.length && i < v2Fragments.length) {
diff --git a/packages/flutter_tools/lib/src/ios/xcodeproj.dart b/packages/flutter_tools/lib/src/ios/xcodeproj.dart
index 9e63865..2bb2a20 100644
--- a/packages/flutter_tools/lib/src/ios/xcodeproj.dart
+++ b/packages/flutter_tools/lib/src/ios/xcodeproj.dart
@@ -171,7 +171,7 @@
 
 Map<String, String> parseXcodeBuildSettings(String showBuildSettingsOutput) {
   final Map<String, String> settings = <String, String>{};
-  for (Match match in showBuildSettingsOutput.split('\n').map(_settingExpr.firstMatch)) {
+  for (Match match in showBuildSettingsOutput.split('\n').map<Match>(_settingExpr.firstMatch)) {
     if (match != null) {
       settings[match[1]] = match[2];
     }
diff --git a/packages/flutter_tools/lib/src/plugins.dart b/packages/flutter_tools/lib/src/plugins.dart
index e9a16d7..2b959c7 100644
--- a/packages/flutter_tools/lib/src/plugins.dart
+++ b/packages/flutter_tools/lib/src/plugins.dart
@@ -94,7 +94,7 @@
   final File pluginsFile = project.flutterPluginsFile;
   final String oldContents = _readFlutterPluginsList(project);
   final String pluginManifest =
-      plugins.map((Plugin p) => '${p.name}=${escapePath(p.path)}').join('\n');
+      plugins.map<String>((Plugin p) => '${p.name}=${escapePath(p.path)}').join('\n');
   if (pluginManifest.isNotEmpty) {
     pluginsFile.writeAsStringSync('$pluginManifest\n', flush: true);
   } else {
@@ -147,7 +147,7 @@
 Future<void> _writeAndroidPluginRegistrant(FlutterProject project, List<Plugin> plugins) async {
   final List<Map<String, dynamic>> androidPlugins = plugins
       .where((Plugin p) => p.androidPackage != null && p.pluginClass != null)
-      .map((Plugin p) => <String, dynamic>{
+      .map<Map<String, dynamic>>((Plugin p) => <String, dynamic>{
           'name': p.name,
           'package': p.androidPackage,
           'class': p.pluginClass,
@@ -238,7 +238,7 @@
 Future<void> _writeIOSPluginRegistrant(FlutterProject project, List<Plugin> plugins) async {
   final List<Map<String, dynamic>> iosPlugins = plugins
       .where((Plugin p) => p.pluginClass != null)
-      .map((Plugin p) => <String, dynamic>{
+      .map<Map<String, dynamic>>((Plugin p) => <String, dynamic>{
     'name': p.name,
     'prefix': p.iosPrefix,
     'class': p.pluginClass,
diff --git a/packages/flutter_tools/lib/src/project.dart b/packages/flutter_tools/lib/src/project.dart
index 9df371a..0654611 100644
--- a/packages/flutter_tools/lib/src/project.dart
+++ b/packages/flutter_tools/lib/src/project.dart
@@ -77,7 +77,7 @@
       example.ios.productBundleIdentifier,
     ];
     return Set<String>.from(candidates
-        .map(_organizationNameFromPackageName)
+        .map<String>(_organizationNameFromPackageName)
         .where((String name) => name != null));
   }
 
diff --git a/packages/flutter_tools/lib/src/resident_runner.dart b/packages/flutter_tools/lib/src/resident_runner.dart
index 2824e20..73cee56 100644
--- a/packages/flutter_tools/lib/src/resident_runner.dart
+++ b/packages/flutter_tools/lib/src/resident_runner.dart
@@ -89,7 +89,7 @@
 
     return vmServices
       .where((VMService service) => !service.isClosed)
-      .expand((VMService service) => viewFilter != null
+      .expand<FlutterView>((VMService service) => viewFilter != null
           ? service.vm.allViewsWithName(viewFilter)
           : service.vm.views)
       .toList();
@@ -149,7 +149,7 @@
     final Uri deviceAssetsDirectoryUri = devFS.baseUri.resolveUri(
         fs.path.toUri(getAssetBuildDirectory()));
     assert(deviceAssetsDirectoryUri != null);
-    await Future.wait(views.map(
+    await Future.wait<Null>(views.map<Future<Null>>(
       (FlutterView view) => view.setAssetDirectory(deviceAssetsDirectoryUri)
     ));
   }
@@ -611,8 +611,8 @@
   }
 
   Future<Null> stopEchoingDeviceLog() async {
-    await Future.wait(
-      flutterDevices.map((FlutterDevice device) => device.stopEchoingDeviceLog())
+    await Future.wait<Null>(
+      flutterDevices.map<Future<Null>>((FlutterDevice device) => device.stopEchoingDeviceLog())
     );
   }
 
diff --git a/packages/flutter_tools/lib/src/run_hot.dart b/packages/flutter_tools/lib/src/run_hot.dart
index f973c89..1d6a0a8 100644
--- a/packages/flutter_tools/lib/src/run_hot.dart
+++ b/packages/flutter_tools/lib/src/run_hot.dart
@@ -582,11 +582,11 @@
         );
         countExpectedReports += reports.length;
         await Future
-            .wait(reports)
+            .wait<Map<String, dynamic>>(reports)
             .catchError((dynamic error) {
               return <Map<String, dynamic>>[error];
             })
-            .then(
+            .then<void>(
               (List<Map<String, dynamic>> list) {
                 // TODO(aam): Investigate why we are validating only first reload report,
                 // which seems to be current behavior
diff --git a/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart b/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart
index edfc074..68cc46f 100644
--- a/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart
+++ b/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart
@@ -425,7 +425,7 @@
   List<String> getRepoRoots() {
     final String root = fs.path.absolute(Cache.flutterRoot);
     // not bin, and not the root
-    return <String>['dev', 'examples', 'packages'].map((String item) {
+    return <String>['dev', 'examples', 'packages'].map<String>((String item) {
       return fs.path.join(root, item);
     }).toList();
   }
@@ -434,7 +434,7 @@
   List<Directory> getRepoPackages() {
     return getRepoRoots()
       .expand<String>((String root) => _gatherProjectPaths(root))
-      .map((String dir) => fs.directory(dir))
+      .map<Directory>((String dir) => fs.directory(dir))
       .toList();
   }
 
diff --git a/packages/flutter_tools/lib/src/services.dart b/packages/flutter_tools/lib/src/services.dart
index 2edceb7..bdc61d2 100644
--- a/packages/flutter_tools/lib/src/services.dart
+++ b/packages/flutter_tools/lib/src/services.dart
@@ -98,7 +98,7 @@
   String dir, List<Map<String, String>> servicesIn
 ) {
   final List<Map<String, String>> services =
-      servicesIn.map((Map<String, String> service) => <String, String>{
+      servicesIn.map<Map<String, String>>((Map<String, String> service) => <String, String>{
         'name': service['name'],
         'class': service['android-class']
       }).toList();
diff --git a/packages/flutter_tools/lib/src/test/flutter_platform.dart b/packages/flutter_tools/lib/src/test/flutter_platform.dart
index 58ae3c6..e734fb2 100644
--- a/packages/flutter_tools/lib/src/test/flutter_platform.dart
+++ b/packages/flutter_tools/lib/src/test/flutter_platform.dart
@@ -526,7 +526,7 @@
           watcher?.handleStartedProcess(ProcessEvent(ourTestCount, process, processObservatoryUri));
         },
         startTimeoutTimer: () {
-          Future<_InitialResult>.delayed(_kTestStartupTimeout).then((_) => timeout.complete());
+          Future<_InitialResult>.delayed(_kTestStartupTimeout).then<void>((_) => timeout.complete());
         },
       );
 
@@ -536,7 +536,7 @@
       // The local test harness could get bored of us.
 
       printTrace('test $ourTestCount: awaiting initial result for pid ${process.pid}');
-      final _InitialResult initialResult = await Future.any(<Future<_InitialResult>>[
+      final _InitialResult initialResult = await Future.any<_InitialResult>(<Future<_InitialResult>>[
         process.exitCode.then<_InitialResult>((int exitCode) => _InitialResult.crashed),
         timeout.future.then<_InitialResult>((void value) => _InitialResult.timedOut),
         Future<_InitialResult>.delayed(_kTestProcessTimeout, () => _InitialResult.timedOut),
@@ -615,13 +615,13 @@
           );
 
           printTrace('test $ourTestCount: awaiting test result for pid ${process.pid}');
-          final _TestResult testResult = await Future.any(<Future<_TestResult>>[
+          final _TestResult testResult = await Future.any<_TestResult>(<Future<_TestResult>>[
             process.exitCode.then<_TestResult>((int exitCode) { return _TestResult.crashed; }),
             harnessDone.future.then<_TestResult>((void value) { return _TestResult.harnessBailed; }),
             testDone.future.then<_TestResult>((void value) { return _TestResult.testBailed; }),
           ]);
 
-          await Future.wait(<Future<void>>[
+          await Future.wait<void>(<Future<void>>[
             harnessToTest.cancel(),
             testToHarness.cancel(),
           ]);
@@ -870,8 +870,8 @@
     const String observatoryString = 'Observatory listening on ';
     for (Stream<List<int>> stream in
         <Stream<List<int>>>[process.stderr, process.stdout]) {
-      stream.transform(utf8.decoder)
-        .transform(const LineSplitter())
+      stream.transform<String>(utf8.decoder)
+        .transform<String>(const LineSplitter())
         .listen(
           (String line) {
             if (line == _kStartTimeoutTimerMessage) {
diff --git a/packages/flutter_tools/lib/src/tester/flutter_tester.dart b/packages/flutter_tools/lib/src/tester/flutter_tester.dart
index 2487d63..4e5ff5f 100644
--- a/packages/flutter_tools/lib/src/tester/flutter_tester.dart
+++ b/packages/flutter_tools/lib/src/tester/flutter_tester.dart
@@ -153,16 +153,16 @@
         },
       );
       // Setting a bool can't fail in the callback.
-      _process.exitCode.then((_) => _isRunning = false); // ignore: unawaited_futures
+      _process.exitCode.then<void>((_) => _isRunning = false); // ignore: unawaited_futures
       _process.stdout
-          .transform(utf8.decoder)
-          .transform(const LineSplitter())
+          .transform<String>(utf8.decoder)
+          .transform<String>(const LineSplitter())
           .listen((String line) {
         _logReader.addLine(line);
       });
       _process.stderr
-          .transform(utf8.decoder)
-          .transform(const LineSplitter())
+          .transform<String>(utf8.decoder)
+          .transform<String>(const LineSplitter())
           .listen((String line) {
         _logReader.addLine(line);
       });
diff --git a/packages/flutter_tools/lib/src/version.dart b/packages/flutter_tools/lib/src/version.dart
index e1dea0e..98612c0 100644
--- a/packages/flutter_tools/lib/src/version.dart
+++ b/packages/flutter_tools/lib/src/version.dart
@@ -161,7 +161,7 @@
   static Future<Null> _removeVersionCheckRemoteIfExists() async {
     final List<String> remotes = (await _run(<String>['git', 'remote']))
         .split('\n')
-        .map((String name) => name.trim()) // to account for OS-specific line-breaks
+        .map<String>((String name) => name.trim()) // to account for OS-specific line-breaks
         .toList();
     if (remotes.contains(_versionCheckRemote))
       await _run(<String>['git', 'remote', 'remove', _versionCheckRemote]);
diff --git a/packages/flutter_tools/lib/src/vmservice.dart b/packages/flutter_tools/lib/src/vmservice.dart
index 3fc389a..ae7652e 100644
--- a/packages/flutter_tools/lib/src/vmservice.dart
+++ b/packages/flutter_tools/lib/src/vmservice.dart
@@ -289,7 +289,7 @@
     String method,
     Map<String, dynamic> params,
   ) {
-    return Future.any(<Future<Map<String, dynamic>>>[
+    return Future.any<Map<String, dynamic>>(<Future<Map<String, dynamic>>>[
       _peer.sendRequest(method, params).then<Map<String, dynamic>>(castStringKeyedMap),
       _connectionError.future,
     ]);
@@ -954,7 +954,7 @@
       return;
     _viewCache.clear();
     for (Isolate isolate in isolates.toList()) {
-      await vmService.vm.invokeRpc('_flutter.listViews',
+      await vmService.vm.invokeRpc<ServiceObject>('_flutter.listViews',
           timeout: kLongRequestTimeout,
           params: <String, dynamic> {'isolateId': isolate.id});
     }
@@ -1208,7 +1208,7 @@
       <Future<ProgramElement>>[];
     for (Map<String, dynamic> element in response['unused'])
       unusedElements.add(_describeElement(element));
-    return Future.wait(unusedElements);
+    return Future.wait<ProgramElement>(unusedElements);
   }
 
   /// Resumes the isolate.
@@ -1388,7 +1388,7 @@
   @override
   void removeWhere(bool test(String key, dynamic value)) => _map.removeWhere(test);
   @override
-  Map<K2, V2> map<K2, V2>(MapEntry<K2, V2> transform(String key, dynamic value)) => _map.map(transform);
+  Map<K2, V2> map<K2, V2>(MapEntry<K2, V2> transform(String key, dynamic value)) => _map.map<K2, V2>(transform);
   @override
   Iterable<MapEntry<String, dynamic>> get entries => _map.entries;
   @override
@@ -1440,7 +1440,7 @@
 
   Future<Null> setAssetDirectory(Uri assetsDirectory) async {
     assert(assetsDirectory != null);
-    await owner.vmService.vm.invokeRpc('_flutter.setAssetBundlePath',
+    await owner.vmService.vm.invokeRpc<ServiceObject>('_flutter.setAssetBundlePath',
         params: <String, dynamic>{
           'isolateId': _uiIsolate.id,
           'viewId': id,
diff --git a/packages/flutter_tools/lib/src/vscode/vscode_validator.dart b/packages/flutter_tools/lib/src/vscode/vscode_validator.dart
index f68a3ec..b93e1d0 100644
--- a/packages/flutter_tools/lib/src/vscode/vscode_validator.dart
+++ b/packages/flutter_tools/lib/src/vscode/vscode_validator.dart
@@ -18,7 +18,7 @@
   static Iterable<DoctorValidator> get installedValidators {
     return VsCode
         .allInstalled()
-        .map((VsCode vsCode) => VsCodeValidator(vsCode));
+        .map<DoctorValidator>((VsCode vsCode) => VsCodeValidator(vsCode));
   }
 
   @override
@@ -32,11 +32,11 @@
     if (_vsCode.isValid) {
       type = ValidationType.installed;
       messages.addAll(_vsCode.validationMessages
-          .map((String m) => ValidationMessage(m)));
+          .map<ValidationMessage>((String m) => ValidationMessage(m)));
     } else {
       type = ValidationType.partial;
       messages.addAll(_vsCode.validationMessages
-          .map((String m) => ValidationMessage.error(m)));
+          .map<ValidationMessage>((String m) => ValidationMessage.error(m)));
       messages.add(ValidationMessage(
           'Flutter extension not installed; install from\n$extensionMarketplaceUrl'));
     }
diff --git a/packages/flutter_tools/test/android/android_workflow_test.dart b/packages/flutter_tools/test/android/android_workflow_test.dart
index 73c9dc1..9564bd8 100644
--- a/packages/flutter_tools/test/android/android_workflow_test.dart
+++ b/packages/flutter_tools/test/android/android_workflow_test.dart
@@ -33,7 +33,7 @@
 
   MockProcess Function(List<String>) processMetaFactory(List<String> stdout) {
     final Stream<List<int>> stdoutStream = Stream<List<int>>.fromIterable(
-        stdout.map((String s) => s.codeUnits));
+        stdout.map<List<int>>((String s) => s.codeUnits));
     return (List<String> command) => MockProcess(stdout: stdoutStream);
   }
 
diff --git a/packages/flutter_tools/test/base/context_test.dart b/packages/flutter_tools/test/base/context_test.dart
index f7291dc..94ec567 100644
--- a/packages/flutter_tools/test/base/context_test.dart
+++ b/packages/flutter_tools/test/base/context_test.dart
@@ -24,7 +24,7 @@
       test('returns root context in child of root zone if zone was manually created', () {
         final Zone rootZone = Zone.current;
         final AppContext rootContext = context;
-        runZoned(() {
+        runZoned<void>(() {
           expect(Zone.current, isNot(rootZone));
           expect(Zone.current.parent, rootZone);
           expect(context, rootContext);
@@ -61,7 +61,7 @@
         final AppContext rootContext = context;
         await rootContext.run<void>(name: 'child', body: () {
           final AppContext childContext = context;
-          runZoned(() {
+          runZoned<void>(() {
             expect(context, isNot(rootContext));
             expect(context, same(childContext));
             expect(context.name, 'child');
@@ -79,7 +79,7 @@
         String value;
         await context.run<void>(
           body: () {
-            outer.future.then((_) {
+            outer.future.then<void>((_) {
               value = context[String];
               inner.complete();
             });
diff --git a/packages/flutter_tools/test/commands/daemon_test.dart b/packages/flutter_tools/test/commands/daemon_test.dart
index 15301da..b1315ea 100644
--- a/packages/flutter_tools/test/commands/daemon_test.dart
+++ b/packages/flutter_tools/test/commands/daemon_test.dart
@@ -73,7 +73,7 @@
     testUsingContext('printStatus should log to stdout when logToStdout is enabled', () async {
       final StringBuffer buffer = StringBuffer();
 
-      await runZoned(() async {
+      await runZoned<Future<void>>(() async {
         final StreamController<Map<String, dynamic>> commands = StreamController<Map<String, dynamic>>();
         final StreamController<Map<String, dynamic>> responses = StreamController<Map<String, dynamic>>();
         daemon = Daemon(
@@ -228,7 +228,7 @@
       daemon.deviceDomain.addDeviceDiscoverer(discoverer);
       discoverer.addDevice(MockAndroidDevice());
 
-      return await responses.stream.skipWhile(_isConnectedEvent).first.then((Map<String, dynamic> response) async {
+      return await responses.stream.skipWhile(_isConnectedEvent).first.then<void>((Map<String, dynamic> response) async {
         expect(response['event'], 'device.added');
         expect(response['params'], isMap);
 
diff --git a/packages/flutter_tools/test/commands/packages_test.dart b/packages/flutter_tools/test/commands/packages_test.dart
index 95c7f46..5f74b3a 100644
--- a/packages/flutter_tools/test/commands/packages_test.dart
+++ b/packages/flutter_tools/test/commands/packages_test.dart
@@ -159,7 +159,7 @@
         pubOutput,
         pluginRegistrants,
         pluginWitnesses,
-      ].expand((List<String> list) => list);
+      ].expand<String>((List<String> list) => list);
       for (String path in allFiles) {
         final File file = fs.file(fs.path.join(projectPath, path));
         if (file.existsSync())
@@ -285,7 +285,7 @@
       final Future<Null> simulateUserInput = Future<Null>(() {
         mockStdio.simulateStdin('y');
       });
-      await Future.wait(<Future<Null>>[runPackages, runPrompt, simulateUserInput]);
+      await Future.wait<Null>(<Future<Null>>[runPackages, runPrompt, simulateUserInput]);
       final List<String> commands = mockProcessManager.commands;
       expect(commands, hasLength(2));
       expect(commands[0], matches(r'dart-sdk[\\/]bin[\\/]pub'));
diff --git a/packages/flutter_tools/test/integration/test_driver.dart b/packages/flutter_tools/test/integration/test_driver.dart
index e70eb15..b8503a2 100644
--- a/packages/flutter_tools/test/integration/test_driver.dart
+++ b/packages/flutter_tools/test/integration/test_driver.dart
@@ -127,7 +127,7 @@
       // Proxy the stream/sink for the VM Client so we can debugPrint it.
       final StreamChannel<String> channel = IOWebSocketChannel.connect(_vmServiceWsUri)
           .cast<String>()
-          .changeStream((Stream<String> stream) => stream.map(_debugPrint))
+          .changeStream((Stream<String> stream) => stream.map<String>(_debugPrint))
           .changeSink((StreamSink<String> sink) =>
               StreamController<String>()
                 ..stream.listen((String s) => sink.add(_debugPrint(s))));
@@ -282,7 +282,7 @@
 
   Future<VMInstanceRef> evaluateExpression(String expression) async {
     final VMFrame topFrame = await getTopStackFrame();
-    return _timeoutWithMessages(() => topFrame.evaluate(expression),
+    return _timeoutWithMessages<VMInstanceRef>(() => topFrame.evaluate(expression),
         message: 'Timed out evaluating expression ($expression)');
   }
 
@@ -334,7 +334,7 @@
       }
     });
 
-    return _timeoutWithMessages(() => response.future,
+    return _timeoutWithMessages<Map<String, dynamic>>(() => response.future,
             timeout: timeout,
             message: event != null
                 ? 'Did not receive expected $event event.'
@@ -406,5 +406,5 @@
 }
 
 Stream<String> _transformToLines(Stream<List<int>> byteStream) {
-  return byteStream.transform(utf8.decoder).transform(const LineSplitter());
+  return byteStream.transform<String>(utf8.decoder).transform<String>(const LineSplitter());
 }
diff --git a/packages/flutter_tools/test/src/context.dart b/packages/flutter_tools/test/src/context.dart
index b20bac2..e91e155 100644
--- a/packages/flutter_tools/test/src/context.dart
+++ b/packages/flutter_tools/test/src/context.dart
@@ -85,7 +85,7 @@
         body: () {
           final String flutterRoot = getFlutterRoot();
 
-          return runZoned(() {
+          return runZoned<Future<dynamic>>(() {
             try {
               return context.run<dynamic>(
                 // Apply the overrides to the test context in the zone since their
@@ -198,7 +198,7 @@
   /// the Doctor.
   List<DoctorValidator> get validators {
     final List<DoctorValidator> superValidators = super.validators;
-    return superValidators.map((DoctorValidator v) {
+    return superValidators.map<DoctorValidator>((DoctorValidator v) {
       if (v is AndroidValidator) {
         return MockAndroidWorkflowValidator();
       }
diff --git a/packages/flutter_tools/test/src/mocks.dart b/packages/flutter_tools/test/src/mocks.dart
index d21cc91..5bcb4bc 100644
--- a/packages/flutter_tools/test/src/mocks.dart
+++ b/packages/flutter_tools/test/src/mocks.dart
@@ -303,8 +303,8 @@
     _stdin.add(utf8.encode('$line\n'));
   }
 
-  List<String> get writtenToStdout => _stdout.writes.map(_stdout.encoding.decode).toList();
-  List<String> get writtenToStderr => _stderr.writes.map(_stderr.encoding.decode).toList();
+  List<String> get writtenToStdout => _stdout.writes.map<String>(_stdout.encoding.decode).toList();
+  List<String> get writtenToStderr => _stderr.writes.map<String>(_stderr.encoding.decode).toList();
 }
 
 class MockPollingDeviceDiscovery extends PollingDeviceDiscovery {
diff --git a/packages/flutter_tools/tool/daemon_client.dart b/packages/flutter_tools/tool/daemon_client.dart
index 10f4895..d8a1d75 100644
--- a/packages/flutter_tools/tool/daemon_client.dart
+++ b/packages/flutter_tools/tool/daemon_client.dart
@@ -23,13 +23,13 @@
   print('daemon process started, pid: ${daemon.pid}');
 
   daemon.stdout
-    .transform(utf8.decoder)
-    .transform(const LineSplitter())
+    .transform<String>(utf8.decoder)
+    .transform<String>(const LineSplitter())
     .listen((String line) => print('<== $line'));
   daemon.stderr.listen((dynamic data) => stderr.add(data));
 
   stdout.write('> ');
-  stdin.transform(utf8.decoder).transform(const LineSplitter()).listen((String line) {
+  stdin.transform<String>(utf8.decoder).transform<String>(const LineSplitter()).listen((String line) {
     final List<String> words = line.split(' ');
 
     if (line == 'version' || line == 'v') {
diff --git a/packages/fuchsia_remote_debug_protocol/lib/src/fuchsia_remote_connection.dart b/packages/fuchsia_remote_debug_protocol/lib/src/fuchsia_remote_connection.dart
index f9add30..1fec7ca 100644
--- a/packages/fuchsia_remote_debug_protocol/lib/src/fuchsia_remote_connection.dart
+++ b/packages/fuchsia_remote_debug_protocol/lib/src/fuchsia_remote_connection.dart
@@ -306,9 +306,9 @@
       }
       isolates.add(vmService.getMainIsolatesByPattern(pattern));
     }
-    final List<IsolateRef> result = await Future.wait(isolates)
+    final List<IsolateRef> result = await Future.wait<List<IsolateRef>>(isolates)
         .timeout(timeout)
-        .then((List<List<IsolateRef>> listOfLists) {
+        .then<List<IsolateRef>>((List<List<IsolateRef>> listOfLists) {
       final List<List<IsolateRef>> mutableListOfLists =
           List<List<IsolateRef>>.from(listOfLists)
             ..retainWhere((List<IsolateRef> list) => list.isNotEmpty);
@@ -477,7 +477,7 @@
     await stop();
     final List<int> servicePorts = await getDeviceServicePorts();
     final List<PortForwarder> forwardedVmServicePorts =
-        await Future.wait(servicePorts.map((int deviceServicePort) {
+        await Future.wait<PortForwarder>(servicePorts.map<Future<PortForwarder>>((int deviceServicePort) {
       return fuchsiaPortForwardingFunction(
           _sshCommandRunner.address,
           deviceServicePort,