Enable and fix a number of lints
diff --git a/pkgs/timing/analysis_options.yaml b/pkgs/timing/analysis_options.yaml
index dd6881e..210b18f 100644
--- a/pkgs/timing/analysis_options.yaml
+++ b/pkgs/timing/analysis_options.yaml
@@ -2,17 +2,92 @@
 analyzer:
   strong-mode:
     implicit-casts: false
-  errors:
-    todo: ignore
-    unused_import: error
-    unused_element: error
-    unused_local_variable: error
-    dead_code: error
-
 linter:
   rules:
+    - always_declare_return_types
+    - annotate_overrides
+    - avoid_bool_literals_in_conditional_expressions
+    - avoid_classes_with_only_static_members
+    - avoid_empty_else
+    - avoid_function_literals_in_foreach_calls
+    - avoid_init_to_null
+    - avoid_null_checks_in_equality_operators
+    - avoid_relative_lib_imports
+    - avoid_renaming_method_parameters
+    - avoid_return_types_on_setters
+    - avoid_returning_null
+    - avoid_returning_null_for_void
+    - avoid_returning_this
+    - avoid_shadowing_type_parameters
+    - avoid_single_cascade_in_expression_statements
+    - avoid_types_as_parameter_names
+    - avoid_unused_constructor_parameters
+    - await_only_futures
+    - camel_case_types
+    - cancel_subscriptions
+    - cascade_invocations
     - comment_references
+    - constant_identifier_names
+    - control_flow_in_finally
+    - curly_braces_in_flow_control_structures
+    - directives_ordering
+    - empty_catches
+    - empty_constructor_bodies
+    - empty_statements
+    - file_names
+    - hash_and_equals
+    - implementation_imports
+    - invariant_booleans
+    - iterable_contains_unrelated_type
+    - join_return_with_assignment
+    - library_names
+    - library_prefixes
+    - list_remove_unrelated_type
+    - literal_only_boolean_expressions
+    - no_duplicate_case_values
+    - non_constant_identifier_names
+    - null_closures
+    - omit_local_variable_types
+    - only_throw_errors
+    - overridden_fields
+    - package_api_docs
+    - package_names
+    - package_prefixed_library_names
+    - prefer_adjacent_string_concatenation
+    - prefer_collection_literals
+    - prefer_conditional_assignment
+    - prefer_const_constructors
+    - prefer_contains
+    - prefer_equal_for_default_values
+    - prefer_final_fields
+    - prefer_final_locals
     - prefer_generic_function_type_aliases
+    - prefer_initializing_formals
+    - prefer_interpolation_to_compose_strings
+    - prefer_iterable_whereType
+    - prefer_is_empty
+    - prefer_is_not_empty
+    - prefer_null_aware_operators
+    - prefer_single_quotes
     - prefer_typing_uninitialized_variables
+    - prefer_void_to_null
+    - recursive_getters
+    - slash_for_doc_comments
+    - test_types_in_equals
+    - throw_in_finally
+    - type_init_formals
+    - unawaited_futures
+    - unnecessary_brace_in_string_interps
     - unnecessary_const
+    - unnecessary_getters_setters
+    - unnecessary_lambdas
     - unnecessary_new
+    - unnecessary_null_aware_assignments
+    - unnecessary_null_in_if_null_operators
+    - unnecessary_parenthesis
+    - unnecessary_statements
+    - unnecessary_this
+    - unrelated_type_equality_checks
+    - use_rethrow_when_possible
+    - valid_regexps
+    - void_checks
diff --git a/pkgs/timing/lib/src/clock.dart b/pkgs/timing/lib/src/clock.dart
index a3ad7d4..ae1f25f 100644
--- a/pkgs/timing/lib/src/clock.dart
+++ b/pkgs/timing/lib/src/clock.dart
@@ -8,13 +8,13 @@
 typedef _Clock = DateTime Function();
 DateTime _defaultClock() => DateTime.now();
 
-const _ZoneKey = #timing_Clock;
+const _zoneKey = #timing_Clock;
 
 /// Returns the current [DateTime].
 ///
 /// May be overridden for tests using [scopeClock].
-DateTime now() => (Zone.current[_ZoneKey] as _Clock ?? _defaultClock)();
+DateTime now() => (Zone.current[_zoneKey] as _Clock ?? _defaultClock)();
 
 /// Runs [f], with [clock] scoped whenever [now] is called.
 T scopeClock<T>(DateTime clock(), T f()) =>
-    runZoned(f, zoneValues: {_ZoneKey: clock});
+    runZoned(f, zoneValues: {_zoneKey: clock});
diff --git a/pkgs/timing/lib/src/timing.dart b/pkgs/timing/lib/src/timing.dart
index 8959cae..17e2fb1 100644
--- a/pkgs/timing/lib/src/timing.dart
+++ b/pkgs/timing/lib/src/timing.dart
@@ -127,8 +127,8 @@
     if (!isTracking) {
       throw StateError('Can be only called while tracking');
     }
-    var _now = now();
-    var prevSlice = TimeSlice(_startTime, _now);
+    final _now = now();
+    final prevSlice = TimeSlice(_startTime, _now);
     _startTime = _now;
     return prevSlice;
   }
@@ -236,7 +236,7 @@
 class AsyncTimeTracker extends TimeSliceGroup implements TimeTracker {
   final bool trackNested;
 
-  static const _ZoneKey = #timing_AsyncTimeTracker;
+  static const _zoneKey = #timing_AsyncTimeTracker;
 
   AsyncTimeTracker({this.trackNested = true}) : super([]);
 
@@ -246,14 +246,14 @@
       return action();
     }
 
-    var isNestedRun = slices.isNotEmpty &&
+    final isNestedRun = slices.isNotEmpty &&
         slices.last is SyncTimeTracker &&
         (slices.last as SyncTimeTracker).isTracking;
-    var isExcludedNestedTrack = !trackNested && zone[_ZoneKey] != this;
+    final isExcludedNestedTrack = !trackNested && zone[_zoneKey] != this;
 
     // Exclude nested sync tracks
     if (isNestedRun && isExcludedNestedTrack) {
-      var timer = slices.last as SyncTimeTracker;
+      final timer = slices.last as SyncTimeTracker;
       // Split already tracked time into new slice.
       // Replace tracker in slices.last with splitted slice, to indicate for
       // recursive calls that we not tracking.
@@ -278,7 +278,7 @@
       return action();
     }
 
-    var timer = SyncTimeTracker();
+    final timer = SyncTimeTracker();
     slices.add(timer);
 
     // Pass to parent zone, in case of overwritten clock
@@ -287,18 +287,18 @@
 
   static final asyncTimeTrackerZoneSpecification = ZoneSpecification(
     run: <R>(Zone self, ZoneDelegate parent, Zone zone, R Function() f) {
-      var tracker = self[_ZoneKey] as AsyncTimeTracker;
+      final tracker = self[_zoneKey] as AsyncTimeTracker;
       return tracker._trackSyncSlice(parent, zone, () => parent.run(zone, f));
     },
     runUnary: <R, T>(Zone self, ZoneDelegate parent, Zone zone, R Function(T) f,
         T arg) {
-      var tracker = self[_ZoneKey] as AsyncTimeTracker;
+      final tracker = self[_zoneKey] as AsyncTimeTracker;
       return tracker._trackSyncSlice(
           parent, zone, () => parent.runUnary(zone, f, arg));
     },
     runBinary: <R, T1, T2>(Zone self, ZoneDelegate parent, Zone zone,
         R Function(T1, T2) f, T1 arg1, T2 arg2) {
-      var tracker = self[_ZoneKey] as AsyncTimeTracker;
+      final tracker = self[_zoneKey] as AsyncTimeTracker;
       return tracker._trackSyncSlice(
           parent, zone, () => parent.runBinary(zone, f, arg1, arg2));
     },
@@ -310,9 +310,9 @@
       throw StateError('Can not be tracked twice');
     }
     _tracking = true;
-    var result = runZoned(action,
+    final result = runZoned(action,
         zoneSpecification: asyncTimeTrackerZoneSpecification,
-        zoneValues: {_ZoneKey: this});
+        zoneValues: {_zoneKey: this});
     if (result is Future) {
       return result
           // Break possible sync processing of future completion, so slice trackers can be finished
diff --git a/pkgs/timing/test/timing_test.dart b/pkgs/timing/test/timing_test.dart
index 9f3f3ac..b2ea8da 100644
--- a/pkgs/timing/test/timing_test.dart
+++ b/pkgs/timing/test/timing_test.dart
@@ -2,15 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// ignore_for_file: only_throw_errors
+
 import 'dart:async';
 
 import 'package:test/test.dart';
 import 'package:timing/src/clock.dart';
 import 'package:timing/src/timing.dart';
 
-_noop() {}
+void _noop() {}
 
-main() {
+void main() {
   DateTime time;
   final startTime = DateTime(2017);
   DateTime fakeClock() => time;
@@ -24,7 +26,7 @@
     time = startTime;
   });
 
-  canHandleSync([additionalExpects() = _noop]) {
+  void canHandleSync([additionalExpects() = _noop]) {
     test('Can track sync code', () {
       expect(tracker.isStarted, false);
       expect(tracker.isTracking, false);
@@ -66,7 +68,7 @@
                 time = time.add(const Duration(seconds: 5));
                 throw 'error';
               }),
-          throwsA(TypeMatcher<String>()));
+          throwsA(const TypeMatcher<String>()));
       expect(tracker.startTime, startTime);
       expect(tracker.stopTime, time);
       expect(tracker.duration, const Duration(seconds: 5));
@@ -92,7 +94,7 @@
     });
   }
 
-  canHandleAsync([additionalExpects() = _noop]) {
+  void canHandleAsync([additionalExpects() = _noop]) {
     test('Can track async code', () async {
       expect(tracker.isStarted, false);
       expect(tracker.isTracking, false);
@@ -132,7 +134,7 @@
     });
 
     test('Can track in case of unhandled async exceptions', () async {
-      var future = scopedTrack(() {
+      final future = scopedTrack(() {
         time = time.add(const Duration(seconds: 1));
         return Future(() {
           time = time.add(const Duration(seconds: 2));
@@ -141,7 +143,7 @@
           time = time.add(const Duration(seconds: 4));
         });
       });
-      await expectLater(future, throwsA(TypeMatcher<String>()));
+      await expectLater(future, throwsA(const TypeMatcher<String>()));
       expect(tracker.isFinished, true);
       expect(tracker.startTime, startTime);
       expect(tracker.stopTime, time);
@@ -206,7 +208,7 @@
     canHandleAsync();
 
     test('Can not distinguish own async code', () async {
-      var future = scopedTrack(() => Future(() {
+      final future = scopedTrack(() => Future(() {
             time = time.add(const Duration(seconds: 5));
           }));
       time = time.add(const Duration(seconds: 10));
@@ -237,8 +239,8 @@
     });
 
     test('Can track complex async innerDuration', () async {
-      var completer = Completer();
-      var future = scopedTrack(() async {
+      final completer = Completer();
+      final future = scopedTrack(() async {
         time = time.add(const Duration(seconds: 1)); // Tracked sync
         await Future.value();
         time = time.add(const Duration(seconds: 2)); // Tracked async
@@ -288,7 +290,7 @@
     test('Can exclude complex nested sync', () {
       tracker = asyncTracker = AsyncTimeTracker(trackNested: false);
       nestedAsyncTracker = AsyncTimeTracker(trackNested: false);
-      var nestedAsyncTracker2 = AsyncTimeTracker(trackNested: false);
+      final nestedAsyncTracker2 = AsyncTimeTracker(trackNested: false);
       scopedTrack(() {
         time = time.add(const Duration(seconds: 1));
         nestedAsyncTracker.track(() {
@@ -323,7 +325,7 @@
         'exclude grand-childrens from parent', () {
       tracker = asyncTracker = AsyncTimeTracker(trackNested: true);
       nestedAsyncTracker = AsyncTimeTracker(trackNested: false);
-      var nestedAsyncTracker2 = AsyncTimeTracker();
+      final nestedAsyncTracker2 = AsyncTimeTracker();
       scopedTrack(() {
         time = time.add(const Duration(seconds: 1));
         nestedAsyncTracker.track(() {
@@ -383,8 +385,8 @@
       tracker = asyncTracker = AsyncTimeTracker(trackNested: false);
       await scopedTrack(() async {
         time = time.add(const Duration(seconds: 1));
-        var completer = Completer();
-        var future = completer.future.then((_) {
+        final completer = Completer();
+        final future = completer.future.then((_) {
           time = time.add(const Duration(seconds: 2));
         });
         await nestedAsyncTracker.track(() async {