enable and fix a number of lints
diff --git a/analysis_options.yaml b/analysis_options.yaml
index e0b01ee..8870dbb 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -13,8 +13,11 @@
 linter:
   rules:
     - avoid_bool_literals_in_conditional_expressions
+    - avoid_catching_errors
     - avoid_classes_with_only_static_members
     - avoid_function_literals_in_foreach_calls
+    - avoid_private_typedef_functions
+    - avoid_redundant_argument_values
     - avoid_renaming_method_parameters
     - avoid_returning_null
     - avoid_returning_null_for_future
@@ -22,10 +25,11 @@
     - avoid_returning_this
     - avoid_single_cascade_in_expression_statements
     - avoid_unused_constructor_parameters
+    - avoid_void_async
     - await_only_futures
     - camel_case_types
     - cancel_subscriptions
-    #- cascade_invocations
+    - cascade_invocations
     - comment_references
     - constant_identifier_names
     - control_flow_in_finally
@@ -37,21 +41,34 @@
     - invariant_booleans
     - iterable_contains_unrelated_type
     - join_return_with_assignment
+    - lines_longer_than_80_chars
     - list_remove_unrelated_type
     - literal_only_boolean_expressions
+    - missing_whitespace_between_adjacent_strings
     - no_adjacent_strings_in_list
+    - no_runtimeType_toString
     - non_constant_identifier_names
     - only_throw_errors
     - overridden_fields
     - package_api_docs
     - package_names
     - package_prefixed_library_names
+    - prefer_asserts_in_initializer_lists
     - prefer_const_constructors
-    #- prefer_final_locals
+    - prefer_const_declarations
+    - prefer_expression_function_bodies
+    - prefer_final_locals
+    - prefer_function_declarations_over_variables
     - prefer_initializing_formals
+    - prefer_inlined_adds
     - prefer_interpolation_to_compose_strings
+    - prefer_is_not_operator
     - prefer_null_aware_operators
+    - prefer_relative_imports
     - prefer_typing_uninitialized_variables
+    - prefer_void_to_null
+    - provide_deprecation_message
+    - sort_pub_dependencies
     - test_types_in_equals
     - throw_in_finally
     - unnecessary_await_in_return
@@ -59,6 +76,9 @@
     - unnecessary_getters_setters
     - unnecessary_lambdas
     - unnecessary_null_aware_assignments
+    - unnecessary_overrides
     - unnecessary_parenthesis
     - unnecessary_statements
+    - unnecessary_string_interpolations
+    - use_string_buffers
     - void_checks
diff --git a/lib/http_retry.dart b/lib/http_retry.dart
index 5bb3695..825b5a2 100644
--- a/lib/http_retry.dart
+++ b/lib/http_retry.dart
@@ -48,20 +48,21 @@
   /// the client has a chance to perform side effects like logging. The
   /// `response` parameter will be null if the request was retried due to an
   /// error for which [whenError] returned `true`.
-  RetryClient(this._inner,
-      {int retries,
-      bool when(BaseResponse response),
-      bool whenError(error, StackTrace stackTrace),
-      Duration delay(int retryCount),
-      void onRetry(BaseRequest request, BaseResponse response, int retryCount)})
-      : _retries = retries ?? 3,
+  RetryClient(
+    this._inner, {
+    int retries,
+    bool Function(BaseResponse) when,
+    bool Function(Object, StackTrace) whenError,
+    Duration Function(int retryCount) delay,
+    void Function(BaseRequest, BaseResponse, int retryCount) onRetry,
+  })  : _retries = retries ?? 3,
         _when = when ?? ((response) => response.statusCode == 503),
         _whenError = whenError ?? ((_, __) => false),
         _delay = delay ??
             ((retryCount) =>
-                Duration(milliseconds: 500) * math.pow(1.5, retryCount)),
+                const Duration(milliseconds: 500) * math.pow(1.5, retryCount)),
         _onRetry = onRetry {
-    RangeError.checkNotNegative(_retries, "retries");
+    RangeError.checkNotNegative(_retries, 'retries');
   }
 
   /// Like [new RetryClient], but with a pre-computed list of [delays]
@@ -70,27 +71,38 @@
   /// This will retry a request at most `delays.length` times, using each delay
   /// in order. It will wait for `delays[0]` after the initial request,
   /// `delays[1]` after the first retry, and so on.
-  RetryClient.withDelays(Client inner, Iterable<Duration> delays,
-      {bool when(BaseResponse response),
-      bool whenError(error, StackTrace stackTrace),
-      void onRetry(BaseRequest request, BaseResponse response, int retryCount)})
-      : this._withDelays(inner, delays.toList(),
-            when: when, whenError: whenError, onRetry: onRetry);
+  RetryClient.withDelays(
+    Client inner,
+    Iterable<Duration> delays, {
+    bool Function(BaseResponse) when,
+    bool Function(Object, StackTrace) whenError,
+    void Function(BaseRequest, BaseResponse, int retryCount) onRetry,
+  }) : this._withDelays(
+          inner,
+          delays.toList(),
+          when: when,
+          whenError: whenError,
+          onRetry: onRetry,
+        );
 
-  RetryClient._withDelays(Client inner, List<Duration> delays,
-      {bool when(BaseResponse response),
-      bool whenError(error, StackTrace stackTrace),
-      void onRetry(BaseRequest request, BaseResponse response, int retryCount)})
-      : this(inner,
-            retries: delays.length,
-            delay: (retryCount) => delays[retryCount],
-            when: when,
-            whenError: whenError,
-            onRetry: onRetry);
+  RetryClient._withDelays(
+    Client inner,
+    List<Duration> delays, {
+    bool Function(BaseResponse) when,
+    bool Function(Object, StackTrace) whenError,
+    void Function(BaseRequest, BaseResponse, int) onRetry,
+  }) : this(
+          inner,
+          retries: delays.length,
+          delay: (retryCount) => delays[retryCount],
+          when: when,
+          whenError: whenError,
+          onRetry: onRetry,
+        );
 
   @override
   Future<StreamedResponse> send(BaseRequest request) async {
-    var splitter = StreamSplitter(request.finalize());
+    final splitter = StreamSplitter(request.finalize());
 
     var i = 0;
     for (;;) {
@@ -117,12 +129,12 @@
 
   /// Returns a copy of [original] with the given [body].
   StreamedRequest _copyRequest(BaseRequest original, Stream<List<int>> body) {
-    var request = StreamedRequest(original.method, original.url);
-    request.contentLength = original.contentLength;
-    request.followRedirects = original.followRedirects;
-    request.headers.addAll(original.headers);
-    request.maxRedirects = original.maxRedirects;
-    request.persistentConnection = original.persistentConnection;
+    final request = StreamedRequest(original.method, original.url)
+      ..contentLength = original.contentLength
+      ..followRedirects = original.followRedirects
+      ..headers.addAll(original.headers)
+      ..maxRedirects = original.maxRedirects
+      ..persistentConnection = original.persistentConnection;
 
     body.listen(request.sink.add,
         onError: request.sink.addError,
diff --git a/test/http_retry_test.dart b/test/http_retry_test.dart
index b51ed1f..bce4b73 100644
--- a/test/http_retry_test.dart
+++ b/test/http_retry_test.dart
@@ -10,129 +10,129 @@
 
 void main() {
   group("doesn't retry when", () {
-    test("a request has a non-503 error code", () async {
-      var client = RetryClient(
-          MockClient(expectAsync1((_) async => Response("", 502), count: 1)));
-      var response = await client.get("http://example.org");
+    test('a request has a non-503 error code', () async {
+      final client = RetryClient(
+          MockClient(expectAsync1((_) async => Response('', 502), count: 1)));
+      final response = await client.get('http://example.org');
       expect(response.statusCode, equals(502));
     });
 
     test("a request doesn't match when()", () async {
-      var client = RetryClient(
-          MockClient(expectAsync1((_) async => Response("", 503), count: 1)),
+      final client = RetryClient(
+          MockClient(expectAsync1((_) async => Response('', 503), count: 1)),
           when: (_) => false);
-      var response = await client.get("http://example.org");
+      final response = await client.get('http://example.org');
       expect(response.statusCode, equals(503));
     });
 
-    test("retries is 0", () async {
-      var client = RetryClient(
-          MockClient(expectAsync1((_) async => Response("", 503), count: 1)),
+    test('retries is 0', () async {
+      final client = RetryClient(
+          MockClient(expectAsync1((_) async => Response('', 503), count: 1)),
           retries: 0);
-      var response = await client.get("http://example.org");
+      final response = await client.get('http://example.org');
       expect(response.statusCode, equals(503));
     });
   });
 
-  test("retries on a 503 by default", () async {
+  test('retries on a 503 by default', () async {
     var count = 0;
-    var client = RetryClient(
+    final client = RetryClient(
         MockClient(expectAsync1((request) async {
           count++;
-          return count < 2 ? Response("", 503) : Response("", 200);
+          return count < 2 ? Response('', 503) : Response('', 200);
         }, count: 2)),
         delay: (_) => Duration.zero);
 
-    var response = await client.get("http://example.org");
+    final response = await client.get('http://example.org');
     expect(response.statusCode, equals(200));
   });
 
-  test("retries on any request where when() returns true", () async {
+  test('retries on any request where when() returns true', () async {
     var count = 0;
-    var client = RetryClient(
+    final client = RetryClient(
         MockClient(expectAsync1((request) async {
           count++;
-          return Response("", 503,
-              headers: {"retry": count < 2 ? "true" : "false"});
+          return Response('', 503,
+              headers: {'retry': count < 2 ? 'true' : 'false'});
         }, count: 2)),
-        when: (response) => response.headers["retry"] == "true",
+        when: (response) => response.headers['retry'] == 'true',
         delay: (_) => Duration.zero);
 
-    var response = await client.get("http://example.org");
-    expect(response.headers, containsPair("retry", "false"));
+    final response = await client.get('http://example.org');
+    expect(response.headers, containsPair('retry', 'false'));
     expect(response.statusCode, equals(503));
   });
 
-  test("retries on any request where whenError() returns true", () async {
+  test('retries on any request where whenError() returns true', () async {
     var count = 0;
-    var client = RetryClient(
+    final client = RetryClient(
         MockClient(expectAsync1((request) async {
           count++;
-          if (count < 2) throw StateError("oh no");
-          return Response("", 200);
+          if (count < 2) throw StateError('oh no');
+          return Response('', 200);
         }, count: 2)),
         whenError: (error, _) =>
-            error is StateError && error.message == "oh no",
+            error is StateError && error.message == 'oh no',
         delay: (_) => Duration.zero);
 
-    var response = await client.get("http://example.org");
+    final response = await client.get('http://example.org');
     expect(response.statusCode, equals(200));
   });
 
   test("doesn't retry a request where whenError() returns false", () async {
-    var client = RetryClient(
-        MockClient(expectAsync1((request) async => throw StateError("oh no"))),
-        whenError: (error, _) => error == "oh yeah",
+    final client = RetryClient(
+        MockClient(expectAsync1((request) async => throw StateError('oh no'))),
+        whenError: (error, _) => error == 'oh yeah',
         delay: (_) => Duration.zero);
 
-    expect(client.get("http://example.org"),
-        throwsA(isStateError.having((e) => e.message, 'message', "oh no")));
+    expect(client.get('http://example.org'),
+        throwsA(isStateError.having((e) => e.message, 'message', 'oh no')));
   });
 
-  test("retries three times by default", () async {
-    var client = RetryClient(
-        MockClient(expectAsync1((_) async => Response("", 503), count: 4)),
+  test('retries three times by default', () async {
+    final client = RetryClient(
+        MockClient(expectAsync1((_) async => Response('', 503), count: 4)),
         delay: (_) => Duration.zero);
-    var response = await client.get("http://example.org");
+    final response = await client.get('http://example.org');
     expect(response.statusCode, equals(503));
   });
 
-  test("retries the given number of times", () async {
-    var client = RetryClient(
-        MockClient(expectAsync1((_) async => Response("", 503), count: 13)),
+  test('retries the given number of times', () async {
+    final client = RetryClient(
+        MockClient(expectAsync1((_) async => Response('', 503), count: 13)),
         retries: 12,
         delay: (_) => Duration.zero);
-    var response = await client.get("http://example.org");
+    final response = await client.get('http://example.org');
     expect(response.statusCode, equals(503));
   });
 
-  test("waits 1.5x as long each time by default", () {
+  test('waits 1.5x as long each time by default', () {
     FakeAsync().run((fake) {
       var count = 0;
-      var client = RetryClient(MockClient(expectAsync1((_) async {
+      final client = RetryClient(MockClient(expectAsync1((_) async {
         count++;
         if (count == 1) {
           expect(fake.elapsed, equals(Duration.zero));
         } else if (count == 2) {
-          expect(fake.elapsed, equals(Duration(milliseconds: 500)));
+          expect(fake.elapsed, equals(const Duration(milliseconds: 500)));
         } else if (count == 3) {
-          expect(fake.elapsed, equals(Duration(milliseconds: 1250)));
+          expect(fake.elapsed, equals(const Duration(milliseconds: 1250)));
         } else if (count == 4) {
-          expect(fake.elapsed, equals(Duration(milliseconds: 2375)));
+          expect(fake.elapsed, equals(const Duration(milliseconds: 2375)));
         }
 
-        return Response("", 503);
+        return Response('', 503);
       }, count: 4)));
 
-      expect(client.get("http://example.org"), completes);
-      fake.elapse(Duration(minutes: 10));
+      expect(client.get('http://example.org'), completes);
+      fake.elapse(const Duration(minutes: 10));
     });
   });
 
-  test("waits according to the delay parameter", () {
+  test('waits according to the delay parameter', () {
     FakeAsync().run((fake) {
       var count = 0;
-      var client = RetryClient(
+      final client = RetryClient(
           MockClient(expectAsync1((_) async {
             count++;
             if (count == 1) {
@@ -140,84 +140,88 @@
             } else if (count == 2) {
               expect(fake.elapsed, equals(Duration.zero));
             } else if (count == 3) {
-              expect(fake.elapsed, equals(Duration(seconds: 1)));
+              expect(fake.elapsed, equals(const Duration(seconds: 1)));
             } else if (count == 4) {
-              expect(fake.elapsed, equals(Duration(seconds: 3)));
+              expect(fake.elapsed, equals(const Duration(seconds: 3)));
             }
 
-            return Response("", 503);
+            return Response('', 503);
           }, count: 4)),
           delay: (requestCount) => Duration(seconds: requestCount));
 
-      expect(client.get("http://example.org"), completes);
-      fake.elapse(Duration(minutes: 10));
+      expect(client.get('http://example.org'), completes);
+      fake.elapse(const Duration(minutes: 10));
     });
   });
 
-  test("waits according to the delay list", () {
+  test('waits according to the delay list', () {
     FakeAsync().run((fake) {
       var count = 0;
-      var client = RetryClient.withDelays(
+      final client = RetryClient.withDelays(
           MockClient(expectAsync1((_) async {
             count++;
             if (count == 1) {
               expect(fake.elapsed, equals(Duration.zero));
             } else if (count == 2) {
-              expect(fake.elapsed, equals(Duration(seconds: 1)));
+              expect(fake.elapsed, equals(const Duration(seconds: 1)));
             } else if (count == 3) {
-              expect(fake.elapsed, equals(Duration(seconds: 61)));
+              expect(fake.elapsed, equals(const Duration(seconds: 61)));
             } else if (count == 4) {
-              expect(fake.elapsed, equals(Duration(seconds: 73)));
+              expect(fake.elapsed, equals(const Duration(seconds: 73)));
             }
 
-            return Response("", 503);
+            return Response('', 503);
           }, count: 4)),
-          [Duration(seconds: 1), Duration(minutes: 1), Duration(seconds: 12)]);
+          const [
+            Duration(seconds: 1),
+            Duration(minutes: 1),
+            Duration(seconds: 12)
+          ]);
 
-      expect(client.get("http://example.org"), completes);
-      fake.elapse(Duration(minutes: 10));
+      expect(client.get('http://example.org'), completes);
+      fake.elapse(const Duration(minutes: 10));
     });
   });
 
-  test("calls onRetry for each retry", () async {
+  test('calls onRetry for each retry', () async {
     var count = 0;
-    var client = RetryClient(
-        MockClient(expectAsync1((_) async => Response("", 503), count: 3)),
+    final client = RetryClient(
+        MockClient(expectAsync1((_) async => Response('', 503), count: 3)),
         retries: 2,
         delay: (_) => Duration.zero,
         onRetry: expectAsync3((request, response, retryCount) {
-          expect(request.url, equals(Uri.parse("http://example.org")));
+          expect(request.url, equals(Uri.parse('http://example.org')));
           expect(response.statusCode, equals(503));
           expect(retryCount, equals(count));
           count++;
         }, count: 2));
-    var response = await client.get("http://example.org");
+    final response = await client.get('http://example.org');
     expect(response.statusCode, equals(503));
   });
 
-  test("copies all request attributes for each attempt", () async {
-    var client = RetryClient.withDelays(
+  test('copies all request attributes for each attempt', () async {
+    final client = RetryClient.withDelays(
         MockClient(expectAsync1((request) async {
           expect(request.contentLength, equals(5));
           expect(request.followRedirects, isFalse);
-          expect(request.headers, containsPair("foo", "bar"));
+          expect(request.headers, containsPair('foo', 'bar'));
           expect(request.maxRedirects, equals(12));
-          expect(request.method, equals("POST"));
+          expect(request.method, equals('POST'));
           expect(request.persistentConnection, isFalse);
-          expect(request.url, equals(Uri.parse("http://example.org")));
-          expect(request.body, equals("hello"));
-          return Response("", 503);
+          expect(request.url, equals(Uri.parse('http://example.org')));
+          expect(request.body, equals('hello'));
+          return Response('', 503);
         }, count: 2)),
         [Duration.zero]);
 
-    var request = Request("POST", Uri.parse("http://example.org"));
-    request.body = "hello";
-    request.followRedirects = false;
-    request.headers["foo"] = "bar";
-    request.maxRedirects = 12;
-    request.persistentConnection = false;
+    final request = Request('POST', Uri.parse('http://example.org'))
+      ..body = 'hello'
+      ..followRedirects = false
+      ..headers['foo'] = 'bar'
+      ..maxRedirects = 12
+      ..persistentConnection = false;
 
-    var response = await client.send(request);
+    final response = await client.send(request);
     expect(response.statusCode, equals(503));
   });
 }