Bump the minimum required SDK – use official generic method syntax
diff --git a/.travis.yml b/.travis.yml
index b6198f7..fff8494 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,12 +1,10 @@
 language: dart
 sudo: false
 dart:
-  - stable
   - dev
+  - stable
   - 1.22.1
   - 1.21.1
-  - 1.20.1
-  - 1.19.1
 dart_task:
   - test: -p vm
   - test: -p firefox
diff --git a/lib/src/chain.dart b/lib/src/chain.dart
index 04a153a..e93b2b4 100644
--- a/lib/src/chain.dart
+++ b/lib/src/chain.dart
@@ -70,7 +70,7 @@
   /// considered unhandled.
   ///
   /// If [callback] returns a value, it will be returned by [capture] as well.
-  static/*=T*/ capture/*<T>*/(/*=T*/ callback(),
+  static T capture<T>(T callback(),
       {void onError(error, Chain chain), bool when: true}) {
     if (!when) {
       var newOnError;
@@ -95,11 +95,9 @@
         // TODO(nweiz): Don't special-case this when issue 19566 is fixed.
         return Zone.current.handleUncaughtError(error, stackTrace);
       }
-    }, zoneSpecification: spec.toSpec(), zoneValues: {
-      _specKey: spec,
-      StackZoneSpecification.disableKey: false
-    }) as dynamic/*=T*/;
-    // TODO(rnystrom): Remove this cast if runZoned() gets a generic type.
+    },
+        zoneSpecification: spec.toSpec(),
+        zoneValues: {_specKey: spec, StackZoneSpecification.disableKey: false});
   }
 
   /// If [when] is `true` and this is called within a [Chain.capture] zone, runs
diff --git a/pubspec.yaml b/pubspec.yaml
index 93f059e..94054ec 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -17,4 +17,4 @@
 dev_dependencies:
   test: '^0.12.17'
 environment:
-  sdk: ">=1.14.0 <2.0.0"
+  sdk: ">=1.21.0 <2.0.0"