Remove some more 'dynamic's
diff --git a/packages/flutter/lib/src/widgets/drag_target.dart b/packages/flutter/lib/src/widgets/drag_target.dart
index c75161d..26fc99f 100644
--- a/packages/flutter/lib/src/widgets/drag_target.dart
+++ b/packages/flutter/lib/src/widgets/drag_target.dart
@@ -80,7 +80,7 @@
 
   /// Should return a new MultiDragGestureRecognizer instance
   /// constructed with the given arguments.
-  MultiDragGestureRecognizer<dynamic> createRecognizer(GestureMultiDragStartCallback onStart);
+  MultiDragGestureRecognizer<MultiDragPointerState> createRecognizer(GestureMultiDragStartCallback onStart);
 
   _DraggableState<T> createState() => new _DraggableState<T>();
 }
diff --git a/packages/flutter/lib/src/widgets/framework.dart b/packages/flutter/lib/src/widgets/framework.dart
index 2babda7..c4f3973 100644
--- a/packages/flutter/lib/src/widgets/framework.dart
+++ b/packages/flutter/lib/src/widgets/framework.dart
@@ -1410,7 +1410,7 @@
       List<Widget> badAncestors = <Widget>[];
       Element ancestor = parent;
       while (ancestor != null) {
-        if (ancestor is ParentDataElement<dynamic>) {
+        if (ancestor is ParentDataElement<RenderObjectWidget>) {
           badAncestors.add(ancestor.widget);
         } else if (ancestor is RenderObjectElement) {
           if (widget.debugIsValidAncestor(ancestor.widget))
@@ -1439,7 +1439,7 @@
       if (child is RenderObjectElement) {
         child.updateParentData(widget);
       } else {
-        assert(child is! ParentDataElement<dynamic>);
+        assert(child is! ParentDataElement<RenderObjectWidget>);
         child.visitChildren(notifyChildren);
       }
     }
@@ -1509,10 +1509,10 @@
     return ancestor;
   }
 
-  ParentDataElement<dynamic> _findAncestorParentDataElement() {
+  ParentDataElement<RenderObjectWidget> _findAncestorParentDataElement() {
     Element ancestor = _parent;
     while (ancestor != null && ancestor is! RenderObjectElement) {
-      if (ancestor is ParentDataElement<dynamic>)
+      if (ancestor is ParentDataElement<RenderObjectWidget>)
         return ancestor;
       ancestor = ancestor._parent;
     }
@@ -1714,7 +1714,7 @@
     widget.didUnmountRenderObject(renderObject);
   }
 
-  void updateParentData(ParentDataWidget<dynamic> parentData) {
+  void updateParentData(ParentDataWidget<RenderObjectWidget> parentData) {
     parentData.applyParentData(renderObject);
   }
 
@@ -1730,7 +1730,7 @@
     _slot = newSlot;
     _ancestorRenderObjectElement = _findAncestorRenderObjectElement();
     _ancestorRenderObjectElement?.insertChildRenderObject(renderObject, newSlot);
-    ParentDataElement<dynamic> parentDataElement = _findAncestorParentDataElement();
+    ParentDataElement<RenderObjectWidget> parentDataElement = _findAncestorParentDataElement();
     if (parentDataElement != null)
       updateParentData(parentDataElement.widget);
   }
@@ -1803,7 +1803,7 @@
   }
 
   void insertChildRenderObject(RenderObject child, dynamic slot) {
-    final RenderObjectWithChildMixin<dynamic> renderObject = this.renderObject;
+    final RenderObjectWithChildMixin<RenderObject> renderObject = this.renderObject;
     assert(slot == null);
     renderObject.child = child;
     assert(renderObject == this.renderObject);
@@ -1814,7 +1814,7 @@
   }
 
   void removeChildRenderObject(RenderObject child) {
-    final RenderObjectWithChildMixin<dynamic> renderObject = this.renderObject;
+    final RenderObjectWithChildMixin<RenderObject> renderObject = this.renderObject;
     assert(renderObject.child == child);
     renderObject.child = null;
     assert(renderObject == this.renderObject);
@@ -1835,19 +1835,19 @@
   final Set<Element> _detachedChildren = new HashSet<Element>();
 
   void insertChildRenderObject(RenderObject child, Element slot) {
-    final ContainerRenderObjectMixin<dynamic, dynamic> renderObject = this.renderObject;
+    final ContainerRenderObjectMixin<RenderObject, ContainerParentDataMixin<RenderObject>> renderObject = this.renderObject;
     renderObject.insert(child, after: slot?.renderObject);
     assert(renderObject == this.renderObject);
   }
 
   void moveChildRenderObject(RenderObject child, dynamic slot) {
-    final ContainerRenderObjectMixin<dynamic, dynamic> renderObject = this.renderObject;
+    final ContainerRenderObjectMixin<RenderObject, ContainerParentDataMixin<RenderObject>> renderObject = this.renderObject;
     renderObject.move(child, after: slot?.renderObject);
     assert(renderObject == this.renderObject);
   }
 
   void removeChildRenderObject(RenderObject child) {
-    final ContainerRenderObjectMixin<dynamic, dynamic> renderObject = this.renderObject;
+    final ContainerRenderObjectMixin<RenderObject, ContainerParentDataMixin<RenderObject>> renderObject = this.renderObject;
     assert(child.parent == renderObject);
     renderObject.remove(child);
     assert(renderObject == this.renderObject);
diff --git a/packages/flutter/lib/src/widgets/notification_listener.dart b/packages/flutter/lib/src/widgets/notification_listener.dart
index c35d0d1..b47bd88 100644
--- a/packages/flutter/lib/src/widgets/notification_listener.dart
+++ b/packages/flutter/lib/src/widgets/notification_listener.dart
@@ -13,8 +13,8 @@
   void dispatch(BuildContext target) {
     target.visitAncestorElements((Element element) {
       if (element is StatelessElement &&
-          element.widget is NotificationListener<dynamic>) {
-        final NotificationListener<dynamic> widget = element.widget;
+          element.widget is NotificationListener<Notification>) {
+        final NotificationListener<Notification> widget = element.widget;
         if (widget._dispatch(this)) // that function checks the type dynamically
           return false;
       }
diff --git a/packages/flutter/lib/src/widgets/virtual_viewport.dart b/packages/flutter/lib/src/widgets/virtual_viewport.dart
index 447f3bc..7e9f6d4 100644
--- a/packages/flutter/lib/src/widgets/virtual_viewport.dart
+++ b/packages/flutter/lib/src/widgets/virtual_viewport.dart
@@ -72,7 +72,7 @@
 
   List<Element> _materializedChildren = const <Element>[];
 
-  RenderVirtualViewport<dynamic> get renderObject => super.renderObject;
+  RenderVirtualViewport<ContainerBoxParentDataMixin<RenderBox>> get renderObject => super.renderObject;
 
   void visitChildren(ElementVisitor visitor) {
     if (_materializedChildren == null)
diff --git a/packages/flutter/test/widget/scroll_events_test.dart b/packages/flutter/test/widget/scroll_events_test.dart
index ad08a14..7a12720 100644
--- a/packages/flutter/test/widget/scroll_events_test.dart
+++ b/packages/flutter/test/widget/scroll_events_test.dart
@@ -46,7 +46,7 @@
 
   test('Scroll scrollTo animation', () {
     testWidgets((WidgetTester tester) {
-      GlobalKey<ScrollableState> scrollKey = new GlobalKey<ScrollableState>();
+      GlobalKey<ScrollableState<Scrollable>> scrollKey = new GlobalKey<ScrollableState<Scrollable>>();
       List<String> log = <String>[];
       tester.pumpWidget(_buildScroller(key: scrollKey, log: log));
 
@@ -64,7 +64,7 @@
 
   test('Scroll scrollTo no animation', () {
     testWidgets((WidgetTester tester) {
-      GlobalKey<ScrollableState> scrollKey = new GlobalKey<ScrollableState>();
+      GlobalKey<ScrollableState<Scrollable>> scrollKey = new GlobalKey<ScrollableState<Scrollable>>();
       List<String> log = <String>[];
       tester.pumpWidget(_buildScroller(key: scrollKey, log: log));
 
@@ -76,7 +76,7 @@
 
   test('Scroll during animation', () {
     testWidgets((WidgetTester tester) {
-      GlobalKey<ScrollableState> scrollKey = new GlobalKey<ScrollableState>();
+      GlobalKey<ScrollableState<Scrollable>> scrollKey = new GlobalKey<ScrollableState<Scrollable>>();
       List<String> log = <String>[];
       tester.pumpWidget(_buildScroller(key: scrollKey, log: log));
 
@@ -98,7 +98,7 @@
 
   test('Scroll during animation', () {
     testWidgets((WidgetTester tester) {
-      GlobalKey<ScrollableState> scrollKey = new GlobalKey<ScrollableState>();
+      GlobalKey<ScrollableState<Scrollable>> scrollKey = new GlobalKey<ScrollableState<Scrollable>>();
       List<String> log = <String>[];
       tester.pumpWidget(_buildScroller(key: scrollKey, log: log));
 
@@ -120,7 +120,7 @@
 
   test('fling, fling generates one start/end pair', () {
     testWidgets((WidgetTester tester) {
-      GlobalKey<ScrollableState> scrollKey = new GlobalKey<ScrollableState>();
+      GlobalKey<ScrollableState<Scrollable>> scrollKey = new GlobalKey<ScrollableState<Scrollable>>();
       List<String> log = <String>[];
       tester.pumpWidget(_buildScroller(key: scrollKey, log: log));
 
diff --git a/packages/flutter_tools/.analysis_options b/packages/flutter_tools/.analysis_options
index fb5be33..0a56cc4 100644
--- a/packages/flutter_tools/.analysis_options
+++ b/packages/flutter_tools/.analysis_options
@@ -15,7 +15,6 @@
     strong_mode_invalid_method_override: ignore
     strong_mode_static_type_error: ignore
     strong_mode_down_cast_composite: ignore
-    type_argument_not_matching_bounds: ignore
     # we allow having TODOs in the code
     todo: ignore
 linter: