diff --git a/.travis.yml b/.travis.yml
index 07f7919..9ce0790 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,7 +1,7 @@
 language: dart
 
 dart:
-  - 2.1.1
+  - 2.6.0
   - dev
 
 install:
@@ -13,7 +13,7 @@
   - coveralls-lcov var/lcov.info
 
 env:
-  - DARTANALYZER_FLAGS=--fatal-warnings
+  - DARTANALYZER_FLAGS="--fatal-warnings --fatal-infos"
 
 # Only building master means that we don't run two builds for each pull request.
 branches:
diff --git a/analysis_options.yaml b/analysis_options.yaml
index 8f7fcfd..82d1a22 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -1,20 +1,8 @@
-# Specify analysis options.
-#
-# Until there are meta linter rules, each desired lint must be explicitly enabled.
-# See: https://github.com/dart-lang/linter/issues/288
-#
-# For a list of lints, see: http://dart-lang.github.io/linter/lints/
-# See the configuration guide for more
-# https://github.com/dart-lang/sdk/tree/master/pkg/analyzer#configuring-the-analyzer
+include: package:pedantic/analysis_options.yaml
 
 analyzer:
   strong-mode:
-    implicit-dynamic: false
-  errors:
-    # treat missing required parameters as a warning (not a hint)
-    missing_required_param: warning
-    # allow having TODOs in the code
-    todo: ignore
+    implicit-casts: false
 
 linter:
   rules:
@@ -44,7 +32,6 @@
     - always_declare_return_types
     # - always_specify_types
     - annotate_overrides
-    - avoid_as
     - avoid_init_to_null
     - avoid_return_types_on_setters
     - await_only_futures
diff --git a/bin/collect_coverage.dart b/bin/collect_coverage.dart
index 14e1767..e49e62f 100644
--- a/bin/collect_coverage.dart
+++ b/bin/collect_coverage.dart
@@ -87,7 +87,7 @@
     exit(1);
   }
 
-  if (args['help']) {
+  if (args['help'] as bool) {
     printUsage();
     exit(0);
   }
@@ -99,25 +99,31 @@
     serviceUri = Uri.parse('http://${args['host']}:${args['port']}/');
   } else {
     try {
-      serviceUri = Uri.parse(args['uri']);
+      serviceUri = Uri.parse(args['uri'] as String);
     } on FormatException {
       fail('Invalid service URI specified: ${args['uri']}');
     }
   }
 
-  // ignore: avoid_as
   final scopedOutput = args['scope-output'] as List<String> ?? [];
 
   IOSink out;
   if (args['out'] == 'stdout') {
     out = stdout;
   } else {
-    final outfile = File(args['out'])..createSync(recursive: true);
+    final outfile = File(args['out'] as String)..createSync(recursive: true);
     out = outfile.openWrite();
   }
   final timeout = (args['connect-timeout'] == null)
       ? null
-      : Duration(seconds: int.parse(args['connect-timeout']));
-  return Options(serviceUri, out, timeout, args['wait-paused'],
-      args['resume-isolates'], args['include-dart'], scopedOutput.toSet());
+      : Duration(seconds: int.parse(args['connect-timeout'] as String));
+  return Options(
+    serviceUri,
+    out,
+    timeout,
+    args['wait-paused'] as bool,
+    args['resume-isolates'] as bool,
+    args['include-dart'] as bool,
+    scopedOutput.toSet(),
+  );
 }
diff --git a/bin/format_coverage.dart b/bin/format_coverage.dart
index 259e1c7..295f861 100644
--- a/bin/format_coverage.dart
+++ b/bin/format_coverage.dart
@@ -30,7 +30,7 @@
 Future<Null> main(List<String> arguments) async {
   final env = parseArgs(arguments);
 
-  final List<File> files = filesToProcess(env.input);
+  final files = filesToProcess(env.input);
   if (env.verbose) {
     print('Environment:');
     print('  # files: ${files.length}');
@@ -75,15 +75,15 @@
   }
 
   if (env.verbose) {
-    if (resolver.failed.length > 0) {
+    if (resolver.failed.isNotEmpty) {
       print('Failed to resolve:');
-      for (String error in resolver.failed.toSet()) {
+      for (var error in resolver.failed.toSet()) {
         print('  $error');
       }
     }
-    if (loader.failed.length > 0) {
+    if (loader.failed.isNotEmpty) {
       print('Failed to load:');
-      for (String error in loader.failed.toSet()) {
+      for (var error in loader.failed.toSet()) {
         print('  $error');
       }
     }
@@ -139,12 +139,12 @@
     exit(1);
   }
 
-  if (args['help']) {
+  if (args['help'] as bool) {
     printUsage();
     exit(0);
   }
 
-  env.sdkRoot = args['sdk-root'];
+  env.sdkRoot = args['sdk-root'] as String;
   if (env.sdkRoot != null) {
     env.sdkRoot = p.normalize(p.join(p.absolute(env.sdkRoot), 'lib'));
     if (!FileSystemEntity.isDirectorySync(env.sdkRoot)) {
@@ -157,23 +157,23 @@
     fail('Only one of --package-root or --packages may be specified.');
   }
 
-  env.packagesPath = args['packages'];
+  env.packagesPath = args['packages'] as String;
   if (env.packagesPath != null) {
     if (!FileSystemEntity.isFileSync(env.packagesPath)) {
       fail('Package spec "${args["packages"]}" not found, or not a file.');
     }
   }
 
-  env.pkgRoot = args['package-root'];
+  env.pkgRoot = args['package-root'] as String;
   if (env.pkgRoot != null) {
-    env.pkgRoot = p.absolute(p.normalize(args['package-root']));
+    env.pkgRoot = p.absolute(p.normalize(args['package-root'] as String));
     if (!FileSystemEntity.isDirectorySync(env.pkgRoot)) {
       fail('Package root "${args["package-root"]}" is not a directory.');
     }
   }
 
   if (args['in'] == null) fail('No input files given.');
-  env.input = p.absolute(p.normalize(args['in']));
+  env.input = p.absolute(p.normalize(args['in'] as String));
   if (!FileSystemEntity.isDirectorySync(env.input) &&
       !FileSystemEntity.isFileSync(env.input)) {
     fail('Provided input "${args["in"]}" is neither a directory nor a file.');
@@ -182,25 +182,26 @@
   if (args['out'] == 'stdout') {
     env.output = stdout;
   } else {
-    final outpath = p.absolute(p.normalize(args['out']));
+    final outpath = p.absolute(p.normalize(args['out'] as String));
     final outfile = File(outpath)..createSync(recursive: true);
     env.output = outfile.openWrite();
   }
 
-  env.reportOn = args['report-on'].isNotEmpty ? args['report-on'] : null;
+  final reportOn = args['report-on'] as List<String>;
+  env.reportOn = reportOn.isNotEmpty ? reportOn : null;
 
-  env.bazel = args['bazel'];
-  env.bazelWorkspace = args['bazel-workspace'];
+  env.bazel = args['bazel'] as bool;
+  env.bazelWorkspace = args['bazel-workspace'] as String;
   if (env.bazelWorkspace.isNotEmpty && !env.bazel) {
     stderr.writeln('warning: ignoring --bazel-workspace: --bazel not set');
   }
 
   if (args['base-directory'] != null) {
-    env.baseDirectory = p.absolute(args['base-directory']);
+    env.baseDirectory = p.absolute(args['base-directory'] as String);
   }
 
-  env.lcov = args['lcov'];
-  if (args['pretty-print'] && env.lcov) {
+  env.lcov = args['lcov'] as bool;
+  if (args['pretty-print'] as bool && env.lcov) {
     fail('Choose one of pretty-print or lcov output');
   }
   // Use pretty-print either explicitly or by default.
@@ -212,7 +213,7 @@
     fail('Invalid worker count: $e');
   }
 
-  env.verbose = args['verbose'];
+  env.verbose = args['verbose'] as bool;
   return env;
 }
 
diff --git a/lib/src/chrome.dart b/lib/src/chrome.dart
index e08b251..cc3a29a 100644
--- a/lib/src/chrome.dart
+++ b/lib/src/chrome.dart
@@ -26,15 +26,15 @@
   Future<Uri> Function(String sourceUrl, String scriptId) sourceUriProvider,
 ) async {
   final coverageReport = <Uri, Map<int, bool>>{};
-  for (Map<String, dynamic> entry in preciseCoverage) {
-    final String scriptId = entry['scriptId'];
+  for (var entry in preciseCoverage) {
+    final scriptId = entry['scriptId'] as String;
 
     final mapResponse = await sourceMapProvider(scriptId);
     if (mapResponse == null) continue;
 
     SingleMapping mapping;
     try {
-      mapping = parse(mapResponse);
+      mapping = parse(mapResponse) as SingleMapping;
     } on FormatException {
       continue;
     } on ArgumentError {
@@ -86,7 +86,7 @@
 /// Returns all covered positions in a provided source.
 Set<_Position> _coveredPositions(
     String compiledSource, List<bool> offsetCoverage) {
-  final positions = Set<_Position>();
+  final positions = <_Position>{};
   // Line is 1 based.
   var line = 1;
   // Column is 1 based.
@@ -109,9 +109,9 @@
   for (Map<String, dynamic> functions in entry['functions']) {
     for (Map<String, dynamic> range in functions['ranges']) {
       result.add(_CoverageInfo(
-        range['startOffset'],
-        range['endOffset'],
-        range['count'] > 0,
+        range['startOffset'] as int,
+        range['endOffset'] as int,
+        (range['count'] as int) > 0,
       ));
     }
   }
diff --git a/lib/src/collect.dart b/lib/src/collect.dart
index 9e24844..f44b030 100644
--- a/lib/src/collect.dart
+++ b/lib/src/collect.dart
@@ -37,7 +37,7 @@
 Future<Map<String, dynamic>> collect(Uri serviceUri, bool resume,
     bool waitPaused, bool includeDart, Set<String> scopedOutput,
     {Set<String> isolateIds, Duration timeout}) async {
-  scopedOutput ??= Set<String>();
+  scopedOutput ??= <String>{};
   if (serviceUri == null) throw ArgumentError('serviceUri must not be null');
 
   // Create websocket URI. Handle any trailing slashes.
@@ -51,7 +51,7 @@
       final options = const CompressionOptions(enabled: false);
       final socket = await WebSocket.connect('$uri', compression: options);
       final controller = StreamController<String>();
-      socket.listen((dynamic data) => controller.add(data));
+      socket.listen((data) => controller.add(data as String));
       service = VmService(
           controller.stream, (String message) => socket.add(message),
           log: StdoutLog(), disposeHandler: () => socket.close());
@@ -78,7 +78,7 @@
 
 Future<Map<String, dynamic>> _getAllCoverage(VmService service,
     bool includeDart, Set<String> scopedOutput, Set<String> isolateIds) async {
-  scopedOutput ??= Set<String>();
+  scopedOutput ??= <String>{};
   final vm = await service.getVM();
   final allCoverage = <Map<String, dynamic>>[];
 
@@ -100,7 +100,7 @@
         allCoverage.addAll(coverage);
       }
     } else {
-      final SourceReport isolateReport = await service.getSourceReport(
+      final isolateReport = await service.getSourceReport(
         isolateRef.id,
         <String>[SourceReportKind.kCoverage],
         forceCompile: true,
@@ -116,7 +116,7 @@
 Future _resumeIsolates(VmService service) async {
   final vm = await service.getVM();
   for (var isolateRef in vm.isolates) {
-    final Isolate isolate = await service.getIsolate(isolateRef.id);
+    final isolate = await service.getIsolate(isolateRef.id) as Isolate;
     if (isolate.pauseEvent.kind != EventKind.kResume) {
       await service.resume(isolateRef.id);
     }
@@ -124,20 +124,20 @@
 }
 
 Future _waitIsolatesPaused(VmService service, {Duration timeout}) async {
-  final pauseEvents = Set<String>.from(<String>[
+  final pauseEvents = <String>{
     EventKind.kPauseStart,
     EventKind.kPauseException,
     EventKind.kPauseExit,
     EventKind.kPauseInterrupted,
     EventKind.kPauseBreakpoint
-  ]);
+  };
 
   Future allPaused() async {
-    final VM vm = await service.getVM();
+    final vm = await service.getVM();
     for (var isolateRef in vm.isolates) {
-      final Isolate isolate = await service.getIsolate(isolateRef.id);
+      final isolate = await service.getIsolate(isolateRef.id) as Isolate;
       if (!pauseEvents.contains(isolate.pauseEvent.kind)) {
-        throw "Unpaused isolates remaining.";
+        throw 'Unpaused isolates remaining.';
       }
     }
   }
@@ -177,7 +177,7 @@
   final scripts = <ScriptRef, Script>{};
   for (var range in report.ranges) {
     final scriptRef = report.scripts[range.scriptIndex];
-    final Uri scriptUri = Uri.parse(report.scripts[range.scriptIndex].uri);
+    final scriptUri = Uri.parse(report.scripts[range.scriptIndex].uri);
 
     // Not returned in scripts section of source report.
     if (scriptUri.scheme == 'evaluate') continue;
@@ -186,7 +186,8 @@
     if (!includeDart && scriptUri.scheme == 'dart') continue;
 
     if (!scripts.containsKey(scriptRef)) {
-      scripts[scriptRef] = await service.getObject(isolateRef.id, scriptRef.id);
+      scripts[scriptRef] =
+          await service.getObject(isolateRef.id, scriptRef.id) as Script;
     }
     final script = scripts[scriptRef];
 
@@ -225,6 +226,7 @@
 class StdoutLog extends Log {
   @override
   void warning(String message) => print(message);
+
   @override
   void severe(String message) => print(message);
 }
diff --git a/lib/src/formatter.dart b/lib/src/formatter.dart
index 1d8383e..d124490 100644
--- a/lib/src/formatter.dart
+++ b/lib/src/formatter.dart
@@ -10,7 +10,7 @@
 
 abstract class Formatter {
   /// Returns the formatted coverage data.
-  Future<String> format(Map hitmap);
+  Future<String> format(Map<String, Map<int, int>> hitmap);
 }
 
 /// Converts the given hitmap to lcov format and appends the result to
@@ -31,11 +31,11 @@
   final List<String> reportOn;
 
   @override
-  Future<String> format(Map hitmap) async {
-    final _PathFilter pathFilter = _getPathFilter(reportOn);
+  Future<String> format(Map<String, Map<int, int>> hitmap) async {
+    final pathFilter = _getPathFilter(reportOn);
     final buf = StringBuffer();
     for (var key in hitmap.keys) {
-      final Map<int, int> v = hitmap[key];
+      final v = hitmap[key];
       var source = resolver.resolve(key);
       if (source == null) {
         continue;
@@ -51,7 +51,7 @@
 
       buf.write('SF:$source\n');
       final lines = v.keys.toList()..sort();
-      for (int k in lines) {
+      for (var k in lines) {
         buf.write('DA:$k,${v[k]}\n');
       }
       buf.write('LF:${lines.length}\n');
@@ -80,11 +80,11 @@
   final List<String> reportOn;
 
   @override
-  Future<String> format(Map hitmap) async {
-    final _PathFilter pathFilter = _getPathFilter(reportOn);
+  Future<String> format(Map<String, dynamic> hitmap) async {
+    final pathFilter = _getPathFilter(reportOn);
     final buf = StringBuffer();
     for (var key in hitmap.keys) {
-      final Map<int, int> v = hitmap[key];
+      final v = hitmap[key] as Map<int, int>;
       final source = resolver.resolve(key);
       if (source == null) {
         continue;
diff --git a/lib/src/hitmap.dart b/lib/src/hitmap.dart
index ab6fb69..e8f5721 100644
--- a/lib/src/hitmap.dart
+++ b/lib/src/hitmap.dart
@@ -10,7 +10,7 @@
 /// are not resolvable.
 ///
 /// `jsonResult` is expected to be a List<Map<String, dynamic>>.
-Map<String, Map<int, int>> createHitmap(List jsonResult) {
+Map<String, Map<int, int>> createHitmap(List<Map<String, dynamic>> jsonResult) {
   // Map of source file to map of line to hit count for that line.
   final globalHitMap = <String, Map<int, int>>{};
 
@@ -19,33 +19,34 @@
     map[line] = count + oldCount;
   }
 
-  for (Map<String, dynamic> e in jsonResult) {
-    final String source = e['source'];
+  for (var e in jsonResult) {
+    final source = e['source'] as String;
     if (source == null) {
       // Couldn't resolve import, so skip this entry.
       continue;
     }
 
     final sourceHitMap = globalHitMap.putIfAbsent(source, () => <int, int>{});
-    final List<dynamic> hits = e['hits'];
+    final hits = e['hits'] as List;
     // hits is a flat array of the following format:
     // [ <line|linerange>, <hitcount>,...]
     // line: number.
     // linerange: '<line>-<line>'.
     for (var i = 0; i < hits.length; i += 2) {
-      final dynamic k = hits[i];
-      if (k is num) {
+      final k = hits[i];
+      if (k is int) {
         // Single line.
-        addToMap(sourceHitMap, k, hits[i + 1]);
-      } else {
-        assert(k is String);
+        addToMap(sourceHitMap, k, hits[i + 1] as int);
+      } else if (k is String) {
         // Linerange. We expand line ranges to actual lines at this point.
-        final int splitPos = k.indexOf('-');
+        final splitPos = k.indexOf('-');
         final start = int.parse(k.substring(0, splitPos));
         final end = int.parse(k.substring(splitPos + 1));
         for (var j = start; j <= end; j++) {
-          addToMap(sourceHitMap, j, hits[i + 1]);
+          addToMap(sourceHitMap, j, hits[i + 1] as int);
         }
+      } else {
+        throw StateError('Expected value of type int or String');
       }
     }
   }
@@ -71,12 +72,16 @@
 }
 
 /// Generates a merged hitmap from a set of coverage JSON files.
-Future<Map> parseCoverage(Iterable<File> files, int _) async {
+Future<Map<String, Map<int, int>>> parseCoverage(
+    Iterable<File> files, int _) async {
   final globalHitmap = <String, Map<int, int>>{};
   for (var file in files) {
     final contents = file.readAsStringSync();
-    final List jsonResult = json.decode(contents)['coverage'];
-    mergeHitmaps(createHitmap(jsonResult), globalHitmap);
+    final jsonResult = json.decode(contents)['coverage'] as List;
+    mergeHitmaps(
+      createHitmap(jsonResult.cast<Map<String, dynamic>>()),
+      globalHitmap,
+    );
   }
   return globalHitmap;
 }
diff --git a/lib/src/resolver.dart b/lib/src/resolver.dart
index 1da70c5..316c66d 100644
--- a/lib/src/resolver.dart
+++ b/lib/src/resolver.dart
@@ -18,7 +18,7 @@
   final String packageRoot;
   final String sdkRoot;
   final List<String> failed = [];
-  Map<String, Uri> _packages;
+  final Map<String, Uri> _packages;
 
   /// Returns the absolute path wrt. to the given environment or null, if the
   /// import could not be resolved.
@@ -40,8 +40,11 @@
         }
         // Canonicalize path. For instance: _collection-dev => _collection_dev.
         path = path.replaceAll('-', '_');
-        final pathSegments = [sdkRoot, path]
-          ..addAll(uri.pathSegments.sublist(1));
+        final pathSegments = [
+          sdkRoot,
+          path,
+          ...uri.pathSegments.sublist(1),
+        ];
         filePath = p.joinAll(pathSegments);
       } else {
         // Resolve 'dart:something' to be something/something.dart in the SDK.
diff --git a/lib/src/run_and_collect.dart b/lib/src/run_and_collect.dart
index 090b64c..94c4160 100644
--- a/lib/src/run_and_collect.dart
+++ b/lib/src/run_and_collect.dart
@@ -49,14 +49,14 @@
   final serviceUri = await serviceUriCompleter.future;
   Map<String, dynamic> coverage;
   try {
-    coverage = await collect(serviceUri, true, true, includeDart, Set<String>(),
+    coverage = await collect(serviceUri, true, true, includeDart, <String>{},
         timeout: timeout);
   } finally {
     await process.stderr.drain<List<int>>();
   }
   final exitStatus = await process.exitCode;
   if (exitStatus != 0) {
-    throw "Process exited with exit code $exitStatus";
+    throw 'Process exited with exit code $exitStatus';
   }
   return coverage;
 }
diff --git a/lib/src/util.dart b/lib/src/util.dart
index ad99654..f0a3d7e 100644
--- a/lib/src/util.dart
+++ b/lib/src/util.dart
@@ -8,10 +8,11 @@
 // TODO(cbracken) make generic
 /// Retries the specified function with the specified interval and returns
 /// the result on successful completion.
-Future<dynamic> retry(Future f(), Duration interval, {Duration timeout}) async {
+Future<dynamic> retry(Future Function() f, Duration interval,
+    {Duration timeout}) async {
   var keepGoing = true;
 
-  Future<dynamic> _withTimeout(Future f(), {Duration duration}) {
+  Future<dynamic> _withTimeout(Future Function() f, {Duration duration}) {
     if (duration == null) {
       return f();
     }
diff --git a/pubspec.yaml b/pubspec.yaml
index 88be6f0..b491d47 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -4,7 +4,7 @@
 homepage: https://github.com/dart-lang/coverage
 
 environment:
-  sdk: '>=2.1.1 <3.0.0'
+  sdk: '>=2.6.0 <3.0.0'
 
 dependencies:
   args: '>=1.4.0 <2.0.0'
@@ -16,6 +16,7 @@
   vm_service: '>=1.0.0 <3.0.0'
 
 dev_dependencies:
+  pedantic: ^1.0.0
   test: ^1.0.0
 
 executables:
diff --git a/test/chrome_test.dart b/test/chrome_test.dart
index 9f09b7e..b9c6a0e 100644
--- a/test/chrome_test.dart
+++ b/test/chrome_test.dart
@@ -28,8 +28,9 @@
 
 void main() {
   test('reports correctly', () async {
-    final List preciseCoverage = json.decode(
-        await File('test/test_files/chrome_precise_report.txt').readAsString());
+    final preciseCoverage = json.decode(
+        await File('test/test_files/chrome_precise_report.txt')
+            .readAsString()) as List;
 
     final report = await parseChromeCoverage(
       preciseCoverage.cast(),
@@ -38,11 +39,11 @@
       sourceUriProvider,
     );
 
-    final Map sourceReport = report['coverage'].firstWhere(
+    final sourceReport = report['coverage'].firstWhere(
         (Map<String, dynamic> report) =>
             report['source'].toString().contains('main_test.dart'));
 
-    final Map<int, int> expectedHits = {
+    final expectedHits = {
       7: 1,
       11: 1,
       13: 1,
@@ -62,7 +63,7 @@
       36: 1,
     };
 
-    final List<int> hitMap = sourceReport['hits'];
+    final hitMap = sourceReport['hits'] as List<int>;
     expect(hitMap.length, equals(expectedHits.keys.length * 2));
     for (var i = 0; i < hitMap.length; i += 2) {
       expect(expectedHits[hitMap[i]], equals(hitMap[i + 1]));
diff --git a/test/collect_coverage_api_test.dart b/test/collect_coverage_api_test.dart
index 0dabd45..658a939 100644
--- a/test/collect_coverage_api_test.dart
+++ b/test/collect_coverage_api_test.dart
@@ -19,21 +19,21 @@
 
 void main() {
   test('collect throws when serviceUri is null', () {
-    expect(() => collect(null, true, false, false, Set<String>()),
+    expect(() => collect(null, true, false, false, <String>{}),
         throwsArgumentError);
   });
 
   test('collect_coverage_api', () async {
-    final Map<String, dynamic> json = await _collectCoverage();
+    final json = await _collectCoverage();
     expect(json.keys, unorderedEquals(<String>['type', 'coverage']));
     expect(json, containsPair('type', 'CodeCoverage'));
 
-    final List coverage = json['coverage'];
+    final coverage = json['coverage'] as List;
     expect(coverage, isNotEmpty);
 
     final sources = coverage.fold(<String, dynamic>{},
         (Map<String, dynamic> map, dynamic value) {
-      final String sourceUri = value['source'];
+      final sourceUri = value['source'] as String;
       map.putIfAbsent(sourceUri, () => <Map>[]).add(value);
       return map;
     });
@@ -48,17 +48,17 @@
   });
 
   test('collect_coverage_api with scoped output', () async {
-    final Map<String, dynamic> json =
-        await _collectCoverage(scopedOutput: Set<String>()..add('coverage'));
+    final json =
+        await _collectCoverage(scopedOutput: <String>{}..add('coverage'));
     expect(json.keys, unorderedEquals(<String>['type', 'coverage']));
     expect(json, containsPair('type', 'CodeCoverage'));
 
-    final List coverage = json['coverage'];
+    final coverage = json['coverage'] as List;
     expect(coverage, isNotEmpty);
 
     final sources = coverage.fold(<String, dynamic>{},
         (Map<String, dynamic> map, dynamic value) {
-      final String sourceUri = value['source'];
+      final sourceUri = value['source'] as String;
       map.putIfAbsent(sourceUri, () => <Map>[]).add(value);
       return map;
     });
@@ -70,22 +70,21 @@
   });
 
   test('collect_coverage_api with isolateIds', () async {
-    final Map<String, dynamic> json = await _collectCoverage(isolateIds: true);
+    final json = await _collectCoverage(isolateIds: true);
     expect(json.keys, unorderedEquals(<String>['type', 'coverage']));
     expect(json, containsPair('type', 'CodeCoverage'));
 
-    final List coverage = json['coverage'];
+    final coverage = json['coverage'] as List<Map<String, dynamic>>;
     expect(coverage, isNotEmpty);
 
-    final Map<String, dynamic> testAppCoverage =
-        _getScriptCoverage(coverage, 'test_app.dart');
-    List<int> hits = testAppCoverage['hits'];
+    final testAppCoverage = _getScriptCoverage(coverage, 'test_app.dart');
+    var hits = testAppCoverage['hits'] as List<int>;
     _expectHitCount(hits, 44, 0);
     _expectHitCount(hits, 48, 0);
 
-    final Map<String, dynamic> isolateCoverage =
+    final isolateCoverage =
         _getScriptCoverage(coverage, 'test_app_isolate.dart');
-    hits = isolateCoverage['hits'];
+    hits = isolateCoverage['hits'] as List<int>;
     _expectHitCount(hits, 11, 1);
     _expectHitCount(hits, 18, 1);
   });
@@ -93,7 +92,7 @@
 
 Future<Map<String, dynamic>> _collectCoverage(
     {Set<String> scopedOutput, bool isolateIds = false}) async {
-  scopedOutput ??= Set<String>();
+  scopedOutput ??= <String>{};
   final openPort = await getOpenPort();
 
   // run the sample app, with the right flags
@@ -107,7 +106,7 @@
       .transform(LineSplitter())
       .listen((line) {
     if (!serviceUriCompleter.isCompleted) {
-      final Uri serviceUri = extractObservatoryUri(line);
+      final serviceUri = extractObservatoryUri(line);
       if (serviceUri != null) {
         serviceUriCompleter.complete(serviceUri);
       }
@@ -117,9 +116,9 @@
     }
   });
 
-  final Uri serviceUri = await serviceUriCompleter.future;
-  final String isolateId = await isolateIdCompleter.future;
-  final Set<String> isolateIdSet = isolateIds ? Set.of([isolateId]) : null;
+  final serviceUri = await serviceUriCompleter.future;
+  final isolateId = await isolateIdCompleter.future;
+  final isolateIdSet = isolateIds ? {isolateId} : null;
 
   return collect(serviceUri, true, true, false, scopedOutput,
       timeout: timeout, isolateIds: isolateIdSet);
@@ -129,8 +128,8 @@
 // script filename, ignoring leading path.
 Map<String, dynamic> _getScriptCoverage(
     List<Map<String, dynamic>> coverage, String filename) {
-  for (Map<String, dynamic> isolateCoverage in coverage) {
-    final Uri script = Uri.parse(isolateCoverage['script']['uri']);
+  for (var isolateCoverage in coverage) {
+    final script = Uri.parse(isolateCoverage['script']['uri'] as String);
     if (script.pathSegments.last == filename) {
       return isolateCoverage;
     }
@@ -141,11 +140,11 @@
 /// Tests that the specified hitmap has the specified hit count for the
 /// specified line.
 void _expectHitCount(List<int> hits, int line, int hitCount) {
-  final int hitIndex = hits.indexOf(line);
+  final hitIndex = hits.indexOf(line);
   if (hitIndex < 0) {
     fail('No hit count for line $line');
   }
-  final int actual = hits[hitIndex + 1];
+  final actual = hits[hitIndex + 1];
   expect(actual, equals(hitCount),
       reason: 'Expected line $line to have $hitCount hits, but found $actual.');
 }
diff --git a/test/collect_coverage_test.dart b/test/collect_coverage_test.dart
index 749e28e..0cf6864 100644
--- a/test/collect_coverage_test.dart
+++ b/test/collect_coverage_test.dart
@@ -24,17 +24,17 @@
     final resultString = await _getCoverageResult();
 
     // analyze the output json
-    final Map<String, dynamic> jsonResult = json.decode(resultString);
+    final jsonResult = json.decode(resultString) as Map<String, dynamic>;
 
     expect(jsonResult.keys, unorderedEquals(<String>['type', 'coverage']));
     expect(jsonResult, containsPair('type', 'CodeCoverage'));
 
-    final List coverage = jsonResult['coverage'];
+    final coverage = jsonResult['coverage'] as List;
     expect(coverage, isNotEmpty);
 
     final sources = coverage.fold<Map<String, dynamic>>(<String, dynamic>{},
         (Map<String, dynamic> map, dynamic value) {
-      final String sourceUri = value['source'];
+      final sourceUri = value['source'] as String;
       map.putIfAbsent(sourceUri, () => <Map>[]).add(value);
       return map;
     });
@@ -50,13 +50,13 @@
 
   test('createHitmap', () async {
     final resultString = await _getCoverageResult();
-    final Map<String, dynamic> jsonResult = json.decode(resultString);
-    final List coverage = jsonResult['coverage'];
-    final hitMap = createHitmap(coverage);
+    final jsonResult = json.decode(resultString) as Map<String, dynamic>;
+    final coverage = jsonResult['coverage'] as List;
+    final hitMap = createHitmap(coverage.cast<Map<String, dynamic>>());
     expect(hitMap, contains(_sampleAppFileUri));
 
-    final Map<int, int> isolateFile = hitMap[_isolateLibFileUri];
-    final Map<int, int> expectedHits = {
+    final isolateFile = hitMap[_isolateLibFileUri];
+    final expectedHits = {
       12: 1,
       13: 1,
       15: 0,
@@ -107,12 +107,8 @@
 
 String _coverageData;
 
-Future<String> _getCoverageResult() async {
-  if (_coverageData == null) {
-    _coverageData = await _collectCoverage();
-  }
-  return _coverageData;
-}
+Future<String> _getCoverageResult() async =>
+    _coverageData ??= await _collectCoverage();
 
 Future<String> _collectCoverage() async {
   expect(FileSystemEntity.isFileSync(testAppPath), isTrue);
@@ -120,7 +116,7 @@
   final openPort = await getOpenPort();
 
   // Run the sample app with the right flags.
-  final Process sampleProcess = await runTestApp(openPort);
+  final sampleProcess = await runTestApp(openPort);
 
   // Capture the VM service URI.
   final serviceUriCompleter = Completer<Uri>();
@@ -129,13 +125,13 @@
       .transform(LineSplitter())
       .listen((line) {
     if (!serviceUriCompleter.isCompleted) {
-      final Uri serviceUri = extractObservatoryUri(line);
+      final serviceUri = extractObservatoryUri(line);
       if (serviceUri != null) {
         serviceUriCompleter.complete(serviceUri);
       }
     }
   });
-  final Uri serviceUri = await serviceUriCompleter.future;
+  final serviceUri = await serviceUriCompleter.future;
 
   // Run the collection tool.
   // TODO: need to get all of this functionality in the lib
@@ -156,7 +152,7 @@
   }
 
   await sampleProcess.exitCode;
-  sampleProcess.stderr.drain<List<int>>();
+  await sampleProcess.stderr.drain<List<int>>();
 
-  return toolResult.stdout;
+  return toolResult.stdout as String;
 }
diff --git a/test/lcov_test.dart b/test/lcov_test.dart
index d4bddd8..b90ea99 100644
--- a/test/lcov_test.dart
+++ b/test/lcov_test.dart
@@ -25,13 +25,13 @@
     expect(hitmap, contains(_isolateLibFileUri));
     expect(hitmap, contains('package:coverage/src/util.dart'));
 
-    final Map<int, int> sampleAppHitMap = hitmap[_sampleAppFileUri];
+    final sampleAppHitMap = hitmap[_sampleAppFileUri];
 
     expect(sampleAppHitMap, containsPair(44, greaterThanOrEqualTo(1)),
         reason: 'be careful if you modify the test file');
     expect(sampleAppHitMap, containsPair(48, 0),
         reason: 'be careful if you modify the test file');
-    expect(sampleAppHitMap, isNot(contains(31)),
+    expect(sampleAppHitMap, isNot(contains(30)),
         reason: 'be careful if you modify the test file');
   });
 
@@ -42,7 +42,7 @@
       final resolver = Resolver(packagesPath: '.packages');
       final formatter = LcovFormatter(resolver);
 
-      final String res = await formatter.format(hitmap);
+      final res = await formatter.format(hitmap);
 
       expect(res, contains(p.absolute(_sampleAppPath)));
       expect(res, contains(p.absolute(_isolateLibPath)));
@@ -55,7 +55,7 @@
       final resolver = Resolver(packagesPath: '.packages');
       final formatter = LcovFormatter(resolver, reportOn: ['lib/', 'test/']);
 
-      final String res = await formatter.format(hitmap);
+      final res = await formatter.format(hitmap);
 
       expect(res, contains(p.absolute(_sampleAppPath)));
       expect(res, contains(p.absolute(_isolateLibPath)));
@@ -68,7 +68,7 @@
       final resolver = Resolver(packagesPath: '.packages');
       final formatter = LcovFormatter(resolver, reportOn: ['lib/']);
 
-      final String res = await formatter.format(hitmap);
+      final res = await formatter.format(hitmap);
 
       expect(res, isNot(contains(p.absolute(_sampleAppPath))));
       expect(res, isNot(contains(p.absolute(_isolateLibPath))));
@@ -81,7 +81,7 @@
       final resolver = Resolver(packagesPath: '.packages');
       final formatter = LcovFormatter(resolver, basePath: p.absolute('lib'));
 
-      final String res = await formatter.format(hitmap);
+      final res = await formatter.format(hitmap);
 
       expect(
           res, isNot(contains(p.absolute(p.join('lib', 'src', 'util.dart')))));
@@ -96,14 +96,14 @@
       final resolver = Resolver(packagesPath: '.packages');
       final formatter = PrettyPrintFormatter(resolver, Loader());
 
-      final String res = await formatter.format(hitmap);
+      final res = await formatter.format(hitmap);
 
       expect(res, contains(p.absolute(_sampleAppPath)));
       expect(res, contains(p.absolute(_isolateLibPath)));
       expect(res, contains(p.absolute(p.join('lib', 'src', 'util.dart'))));
 
       // be very careful if you change the test file
-      expect(res, contains("      0|  return a - b;"));
+      expect(res, contains('      0|  return a - b;'));
 
       expect(res, contains('|  return _withTimeout(() async {'),
           reason: 'be careful if you change lib/src/util.dart');
@@ -122,7 +122,7 @@
       final formatter =
           PrettyPrintFormatter(resolver, Loader(), reportOn: ['lib/', 'test/']);
 
-      final String res = await formatter.format(hitmap);
+      final res = await formatter.format(hitmap);
 
       expect(res, contains(p.absolute(_sampleAppPath)));
       expect(res, contains(p.absolute(_isolateLibPath)));
@@ -136,7 +136,7 @@
       final formatter =
           PrettyPrintFormatter(resolver, Loader(), reportOn: ['lib/']);
 
-      final String res = await formatter.format(hitmap);
+      final res = await formatter.format(hitmap);
 
       expect(res, isNot(contains(p.absolute(_sampleAppPath))));
       expect(res, isNot(contains(p.absolute(_isolateLibPath))));
@@ -145,7 +145,7 @@
   });
 }
 
-Future<Map> _getHitMap() async {
+Future<Map<String, Map<int, int>>> _getHitMap() async {
   expect(FileSystemEntity.isFileSync(_sampleAppPath), isTrue);
 
   // select service port.
@@ -166,17 +166,18 @@
       .transform(LineSplitter())
       .listen((line) {
     if (!serviceUriCompleter.isCompleted) {
-      final Uri serviceUri = extractObservatoryUri(line);
+      final serviceUri = extractObservatoryUri(line);
       if (serviceUri != null) {
         serviceUriCompleter.complete(serviceUri);
       }
     }
   });
-  final Uri serviceUri = await serviceUriCompleter.future;
+  final serviceUri = await serviceUriCompleter.future;
 
   // collect hit map.
-  final List<Map> coverageJson =
-      (await collect(serviceUri, true, true, false, Set<String>()))['coverage'];
+  final coverageJson =
+      (await collect(serviceUri, true, true, false, <String>{}))['coverage']
+          as List<Map<String, dynamic>>;
   final hitMap = createHitmap(coverageJson);
 
   // wait for sample app to terminate.
@@ -185,6 +186,6 @@
     throw ProcessException(
         'dart', sampleAppArgs, 'Fatal error. Exit code: $exitCode', exitCode);
   }
-  sampleProcess.stderr.drain<List<int>>();
+  await sampleProcess.stderr.drain<List<int>>();
   return hitMap;
 }
diff --git a/test/run_and_collect_test.dart b/test/run_and_collect_test.dart
index 445a557..6b3e949 100644
--- a/test/run_and_collect_test.dart
+++ b/test/run_and_collect_test.dart
@@ -22,12 +22,12 @@
     expect(json.keys, unorderedEquals(<String>['type', 'coverage']));
     expect(json, containsPair('type', 'CodeCoverage'));
 
-    final List<Map> coverage = json['coverage'];
+    final coverage = json['coverage'] as List<Map<String, dynamic>>;
     expect(coverage, isNotEmpty);
 
     final sources = coverage.fold<Map<String, dynamic>>(<String, dynamic>{},
         (Map<String, dynamic> map, dynamic value) {
-      final String sourceUri = value['source'];
+      final sourceUri = value['source'] as String;
       map.putIfAbsent(sourceUri, () => <Map>[]).add(value);
       return map;
     });
@@ -43,8 +43,8 @@
     final hitMap = createHitmap(coverage);
     expect(hitMap, contains(_sampleAppFileUri));
 
-    final Map<int, int> isolateFile = hitMap[_isolateLibFileUri];
-    final Map<int, int> expectedHits = {
+    final isolateFile = hitMap[_isolateLibFileUri];
+    final expectedHits = {
       12: 1,
       13: 1,
       15: 0,
diff --git a/test/test_files/test_app.dart b/test/test_files/test_app.dart
index 3d7b79c..1677fbe 100644
--- a/test/test_files/test_app.dart
+++ b/test/test_files/test_app.dart
@@ -6,7 +6,6 @@
 import 'dart:developer';
 import 'dart:isolate';
 
-// explicitly using a package import to validate hitmap coverage of packages
 import 'package:coverage/src/util.dart';
 
 import 'test_app_isolate.dart';
@@ -21,9 +20,9 @@
     }
   }
 
-  final ReceivePort port = ReceivePort();
+  final port = ReceivePort();
 
-  final Isolate isolate =
+  final isolate =
       await Isolate.spawn(isolateTask, [port.sendPort, 1, 2], paused: true);
   await Service.controlWebServer(enable: true);
   final isolateID = Service.getIsolateID(isolate);
@@ -32,12 +31,12 @@
   isolate.addOnExitListener(port.sendPort);
   isolate.resume(isolate.pauseCapability);
 
-  final int value = await port.first;
+  final value = await port.first as int;
   if (value != 3) {
     throw 'expected 3!';
   }
 
-  final int result = await retry(() async => 42, const Duration(seconds: 1));
+  final result = await retry(() async => 42, const Duration(seconds: 1)) as int;
   print(result);
 }
 
diff --git a/test/test_files/test_app_isolate.dart b/test/test_files/test_app_isolate.dart
index 2f0b770..0f72d27 100644
--- a/test/test_files/test_app_isolate.dart
+++ b/test/test_files/test_app_isolate.dart
@@ -30,8 +30,8 @@
 
   fooSync(answer);
   fooAsync(answer).then((_) {
-    final SendPort port = threeThings.first;
-    final int sum = threeThings[1] + threeThings[2];
+    final port = threeThings.first as SendPort;
+    final sum = (threeThings[1] + threeThings[2]) as int;
     port.send(sum);
   });
 }
diff --git a/test/util_test.dart b/test/util_test.dart
index 13c97cb..b98ffe2 100644
--- a/test/util_test.dart
+++ b/test/util_test.dart
@@ -12,7 +12,7 @@
 
 void main() {
   test('retry', () async {
-    int count = 0;
+    var count = 0;
     final stopwatch = Stopwatch()..start();
 
     Future failCountTimes() async {
@@ -25,7 +25,7 @@
       return 42;
     }
 
-    final int value = await retry(failCountTimes, _delay);
+    final value = await retry(failCountTimes, _delay) as int;
 
     expect(value, 42);
     expect(count, _failCount);
@@ -34,7 +34,7 @@
 
   group('retry with timeout', () {
     test('if it finishes', () async {
-      int count = 0;
+      var count = 0;
       final stopwatch = Stopwatch()..start();
 
       Future failCountTimes() async {
@@ -48,8 +48,11 @@
       }
 
       final safeTimoutDuration = _delay * _failCount * 2;
-      final int value =
-          await retry(failCountTimes, _delay, timeout: safeTimoutDuration);
+      final value = await retry(
+        failCountTimes,
+        _delay,
+        timeout: safeTimoutDuration,
+      ) as int;
 
       expect(value, 42);
       expect(count, _failCount);
@@ -57,7 +60,7 @@
     });
 
     test('if it does not finish', () async {
-      int count = 0;
+      var count = 0;
       final stopwatch = Stopwatch()..start();
 
       var caught = false;
@@ -78,7 +81,7 @@
       try {
         await retry(failCountTimes, _delay, timeout: unsafeTimeoutDuration);
       } on StateError catch (e) {
-        expect(e.message, "Failed to complete within 25ms");
+        expect(e.message, 'Failed to complete within 25ms');
         caught = true;
 
         expect(countAfterError, 0,
