diff --git a/pkgs/string_scanner/analysis_options.yaml b/pkgs/string_scanner/analysis_options.yaml
index 7684be7..60abe63 100644
--- a/pkgs/string_scanner/analysis_options.yaml
+++ b/pkgs/string_scanner/analysis_options.yaml
@@ -7,19 +7,21 @@
 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
     - avoid_returning_null_for_void
     - 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
     - comment_references
     - constant_identifier_names
     - control_flow_in_finally
@@ -31,21 +33,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
@@ -53,6 +68,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/pkgs/string_scanner/example/example.dart b/pkgs/string_scanner/example/example.dart
index 0358967..e92677f 100644
--- a/pkgs/string_scanner/example/example.dart
+++ b/pkgs/string_scanner/example/example.dart
@@ -12,11 +12,11 @@
 
 num parseNumber(String source) {
   // Scan a number ("1", "1.5", "-3").
-  var scanner = StringScanner(source);
+  final scanner = StringScanner(source);
 
   // [Scanner.scan] tries to consume a [Pattern] and returns whether or not it
   // succeeded. It will move the scan pointer past the end of the pattern.
-  var negative = scanner.scan('-');
+  final negative = scanner.scan('-');
 
   // [Scanner.expect] consumes a [Pattern] and throws a [FormatError] if it
   // fails. Like [Scanner.scan], it will move the scan pointer forward.
@@ -28,7 +28,7 @@
 
   if (scanner.scan('.')) {
     scanner.expect(RegExp(r'\d+'));
-    var decimal = scanner.lastMatch[0];
+    final decimal = scanner.lastMatch[0];
     number += int.parse(decimal) / math.pow(10, decimal.length);
   }
 
diff --git a/pkgs/string_scanner/lib/src/eager_span_scanner.dart b/pkgs/string_scanner/lib/src/eager_span_scanner.dart
index d34e4f7..848cb72 100644
--- a/pkgs/string_scanner/lib/src/eager_span_scanner.dart
+++ b/pkgs/string_scanner/lib/src/eager_span_scanner.dart
@@ -44,11 +44,11 @@
 
   @override
   set position(int newPosition) {
-    var oldPosition = position;
+    final oldPosition = position;
     super.position = newPosition;
 
     if (newPosition > oldPosition) {
-      var newlines = _newlinesIn(string.substring(oldPosition, newPosition));
+      final newlines = _newlinesIn(string.substring(oldPosition, newPosition));
       _line += newlines.length;
       if (newlines.isEmpty) {
         _column += newPosition - oldPosition;
@@ -56,7 +56,7 @@
         _column = newPosition - newlines.last.end;
       }
     } else {
-      var newlines = _newlinesIn(string.substring(newPosition, oldPosition));
+      final newlines = _newlinesIn(string.substring(newPosition, oldPosition));
       if (_betweenCRLF) newlines.removeLast();
 
       _line -= newlines.length;
@@ -81,7 +81,7 @@
 
   @override
   int readChar() {
-    var character = super.readChar();
+    final character = super.readChar();
     _adjustLineAndColumn(character);
     return character;
   }
@@ -100,7 +100,7 @@
   bool scan(Pattern pattern) {
     if (!super.scan(pattern)) return false;
 
-    var newlines = _newlinesIn(lastMatch[0]);
+    final newlines = _newlinesIn(lastMatch[0]);
     _line += newlines.length;
     if (newlines.isEmpty) {
       _column += lastMatch[0].length;
@@ -114,7 +114,7 @@
   /// Returns a list of [Match]es describing all the newlines in [text], which
   /// is assumed to end at [position].
   List<Match> _newlinesIn(String text) {
-    var newlines = _newlineRegExp.allMatches(text).toList();
+    final newlines = _newlineRegExp.allMatches(text).toList();
     if (_betweenCRLF) newlines.removeLast();
     return newlines;
   }
diff --git a/pkgs/string_scanner/lib/src/line_scanner.dart b/pkgs/string_scanner/lib/src/line_scanner.dart
index 180d923..9e7d918 100644
--- a/pkgs/string_scanner/lib/src/line_scanner.dart
+++ b/pkgs/string_scanner/lib/src/line_scanner.dart
@@ -48,11 +48,11 @@
 
   @override
   set position(int newPosition) {
-    var oldPosition = position;
+    final oldPosition = position;
     super.position = newPosition;
 
     if (newPosition > oldPosition) {
-      var newlines = _newlinesIn(string.substring(oldPosition, newPosition));
+      final newlines = _newlinesIn(string.substring(oldPosition, newPosition));
       _line += newlines.length;
       if (newlines.isEmpty) {
         _column += newPosition - oldPosition;
@@ -60,7 +60,7 @@
         _column = newPosition - newlines.last.end;
       }
     } else {
-      var newlines = _newlinesIn(string.substring(newPosition, oldPosition));
+      final newlines = _newlinesIn(string.substring(newPosition, oldPosition));
       if (_betweenCRLF) newlines.removeLast();
 
       _line -= newlines.length;
@@ -85,7 +85,7 @@
 
   @override
   int readChar() {
-    var character = super.readChar();
+    final character = super.readChar();
     _adjustLineAndColumn(character);
     return character;
   }
@@ -104,7 +104,7 @@
   bool scan(Pattern pattern) {
     if (!super.scan(pattern)) return false;
 
-    var newlines = _newlinesIn(lastMatch[0]);
+    final newlines = _newlinesIn(lastMatch[0]);
     _line += newlines.length;
     if (newlines.isEmpty) {
       _column += lastMatch[0].length;
@@ -118,7 +118,7 @@
   /// Returns a list of [Match]es describing all the newlines in [text], which
   /// is assumed to end at [position].
   List<Match> _newlinesIn(String text) {
-    var newlines = _newlineRegExp.allMatches(text).toList();
+    final newlines = _newlineRegExp.allMatches(text).toList();
     if (_betweenCRLF) newlines.removeLast();
     return newlines;
   }
diff --git a/pkgs/string_scanner/lib/src/relative_span_scanner.dart b/pkgs/string_scanner/lib/src/relative_span_scanner.dart
index 096bee3..a7a035a 100644
--- a/pkgs/string_scanner/lib/src/relative_span_scanner.dart
+++ b/pkgs/string_scanner/lib/src/relative_span_scanner.dart
@@ -34,8 +34,8 @@
 
   @override
   int get column {
-    var line = _sourceFile.getLine(_startLocation.offset + position);
-    var column =
+    final line = _sourceFile.getLine(_startLocation.offset + position);
+    final column =
         _sourceFile.getColumn(_startLocation.offset + position, line: line);
     return line == _startLocation.line
         ? column - _startLocation.column
@@ -74,7 +74,7 @@
 
   @override
   FileSpan spanFrom(LineScannerState startState, [LineScannerState endState]) {
-    var endPosition = endState == null ? position : endState.position;
+    final endPosition = endState == null ? position : endState.position;
     return _sourceFile.span(_startLocation.offset + startState.position,
         _startLocation.offset + endPosition);
   }
@@ -99,7 +99,7 @@
     position ??= match == null ? this.position : match.start;
     length ??= match == null ? 1 : match.end - match.start;
 
-    var span = _sourceFile.span(_startLocation.offset + position,
+    final span = _sourceFile.span(_startLocation.offset + position,
         _startLocation.offset + position + length);
     throw StringScannerException(message, span, string);
   }
diff --git a/pkgs/string_scanner/lib/src/span_scanner.dart b/pkgs/string_scanner/lib/src/span_scanner.dart
index 732a76f..1a8ca2a 100644
--- a/pkgs/string_scanner/lib/src/span_scanner.dart
+++ b/pkgs/string_scanner/lib/src/span_scanner.dart
@@ -82,14 +82,14 @@
   ///
   /// This scans through [span]`.text, but emits new spans from [span]`.file` in
   /// their appropriate relative positions. The [string] field contains only
-  /// [span]`.text`, and [position], [line], and [column] are all relative to the
-  /// span.
+  /// [span]`.text`, and [position], [line], and [column] are all relative to
+  /// the span.
   factory SpanScanner.within(FileSpan span) = RelativeSpanScanner;
 
   /// Creates a [FileSpan] representing the source range between [startState]
   /// and the current position.
   FileSpan spanFrom(LineScannerState startState, [LineScannerState endState]) {
-    var endPosition = endState == null ? position : endState.position;
+    final endPosition = endState == null ? position : endState.position;
     return _sourceFile.span(startState.position, endPosition);
   }
 
@@ -112,7 +112,7 @@
     position ??= match == null ? this.position : match.start;
     length ??= match == null ? 0 : match.end - match.start;
 
-    var span = _sourceFile.span(position, position + length);
+    final span = _sourceFile.span(position, position + length);
     throw StringScannerException(message, span, string);
   }
 }
diff --git a/pkgs/string_scanner/lib/src/string_scanner.dart b/pkgs/string_scanner/lib/src/string_scanner.dart
index 1739a7c..55ff17d 100644
--- a/pkgs/string_scanner/lib/src/string_scanner.dart
+++ b/pkgs/string_scanner/lib/src/string_scanner.dart
@@ -81,7 +81,7 @@
   /// affect [lastMatch].
   int peekChar([int offset]) {
     offset ??= 0;
-    var index = position + offset;
+    final index = position + offset;
     if (index < 0 || index >= string.length) return null;
     return string.codeUnitAt(index);
   }
@@ -123,7 +123,7 @@
   ///
   /// Returns whether or not [pattern] matched.
   bool scan(Pattern pattern) {
-    var success = matches(pattern);
+    final success = matches(pattern);
     if (success) {
       _position = _lastMatch.end;
       _lastMatchPosition = _position;
@@ -143,7 +143,7 @@
 
     if (name == null) {
       if (pattern is RegExp) {
-        var source = pattern.pattern;
+        final source = pattern.pattern;
         name = '/$source/';
       } else {
         name =
@@ -201,8 +201,8 @@
     position ??= match == null ? this.position : match.start;
     length ??= match == null ? 0 : match.end - match.start;
 
-    var sourceFile = SourceFile.fromString(string, url: sourceUrl);
-    var span = sourceFile.span(position, position + length);
+    final sourceFile = SourceFile.fromString(string, url: sourceUrl);
+    final span = sourceFile.span(position, position + length);
     throw StringScannerException(message, span, string);
   }
 
diff --git a/pkgs/string_scanner/test/error_test.dart b/pkgs/string_scanner/test/error_test.dart
index dfa7175..6173040 100644
--- a/pkgs/string_scanner/test/error_test.dart
+++ b/pkgs/string_scanner/test/error_test.dart
@@ -9,7 +9,7 @@
 
 void main() {
   test('defaults to the last match', () {
-    var scanner = StringScanner('foo bar baz');
+    final scanner = StringScanner('foo bar baz');
     scanner.expect('foo ');
     scanner.expect('bar');
     expect(() => scanner.error('oh no!'), throwsStringScannerException('bar'));
@@ -17,39 +17,39 @@
 
   group('with match', () {
     test('supports an earlier match', () {
-      var scanner = StringScanner('foo bar baz');
+      final scanner = StringScanner('foo bar baz');
       scanner.expect('foo ');
-      var match = scanner.lastMatch;
+      final match = scanner.lastMatch;
       scanner.expect('bar');
       expect(() => scanner.error('oh no!', match: match),
           throwsStringScannerException('foo '));
     });
 
     test('supports a match on a previous line', () {
-      var scanner = StringScanner('foo bar baz\ndo re mi\nearth fire water');
+      final scanner = StringScanner('foo bar baz\ndo re mi\nearth fire water');
       scanner.expect('foo bar baz\ndo ');
       scanner.expect('re');
-      var match = scanner.lastMatch;
+      final match = scanner.lastMatch;
       scanner.expect(' mi\nearth ');
       expect(() => scanner.error('oh no!', match: match),
           throwsStringScannerException('re'));
     });
 
     test('supports a multiline match', () {
-      var scanner = StringScanner('foo bar baz\ndo re mi\nearth fire water');
+      final scanner = StringScanner('foo bar baz\ndo re mi\nearth fire water');
       scanner.expect('foo bar ');
       scanner.expect('baz\ndo');
-      var match = scanner.lastMatch;
+      final match = scanner.lastMatch;
       scanner.expect(' re mi');
       expect(() => scanner.error('oh no!', match: match),
           throwsStringScannerException('baz\ndo'));
     });
 
     test('supports a match after position', () {
-      var scanner = StringScanner('foo bar baz');
+      final scanner = StringScanner('foo bar baz');
       scanner.expect('foo ');
       scanner.expect('bar');
-      var match = scanner.lastMatch;
+      final match = scanner.lastMatch;
       scanner.position = 0;
       expect(() => scanner.error('oh no!', match: match),
           throwsStringScannerException('bar'));
@@ -58,48 +58,48 @@
 
   group('with position and/or length', () {
     test('defaults to length 0', () {
-      var scanner = StringScanner('foo bar baz');
+      final scanner = StringScanner('foo bar baz');
       scanner.expect('foo ');
       expect(() => scanner.error('oh no!', position: 1),
           throwsStringScannerException(''));
     });
 
     test('defaults to the current position', () {
-      var scanner = StringScanner('foo bar baz');
+      final scanner = StringScanner('foo bar baz');
       scanner.expect('foo ');
       expect(() => scanner.error('oh no!', length: 3),
           throwsStringScannerException('bar'));
     });
 
     test('supports an earlier position', () {
-      var scanner = StringScanner('foo bar baz');
+      final scanner = StringScanner('foo bar baz');
       scanner.expect('foo ');
       expect(() => scanner.error('oh no!', position: 1, length: 2),
           throwsStringScannerException('oo'));
     });
 
     test('supports a position on a previous line', () {
-      var scanner = StringScanner('foo bar baz\ndo re mi\nearth fire water');
+      final scanner = StringScanner('foo bar baz\ndo re mi\nearth fire water');
       scanner.expect('foo bar baz\ndo re mi\nearth');
       expect(() => scanner.error('oh no!', position: 15, length: 2),
           throwsStringScannerException('re'));
     });
 
     test('supports a multiline length', () {
-      var scanner = StringScanner('foo bar baz\ndo re mi\nearth fire water');
+      final scanner = StringScanner('foo bar baz\ndo re mi\nearth fire water');
       scanner.expect('foo bar baz\ndo re mi\nearth');
       expect(() => scanner.error('oh no!', position: 8, length: 8),
           throwsStringScannerException('baz\ndo r'));
     });
 
     test('supports a position after the current one', () {
-      var scanner = StringScanner('foo bar baz');
+      final scanner = StringScanner('foo bar baz');
       expect(() => scanner.error('oh no!', position: 4, length: 3),
           throwsStringScannerException('bar'));
     });
 
     test('supports a length of zero', () {
-      var scanner = StringScanner('foo bar baz');
+      final scanner = StringScanner('foo bar baz');
       expect(() => scanner.error('oh no!', position: 4, length: 0),
           throwsStringScannerException(''));
     });
diff --git a/pkgs/string_scanner/test/line_scanner_test.dart b/pkgs/string_scanner/test/line_scanner_test.dart
index dc9b8cf..aafc74a 100644
--- a/pkgs/string_scanner/test/line_scanner_test.dart
+++ b/pkgs/string_scanner/test/line_scanner_test.dart
@@ -150,7 +150,7 @@
 
   test('state= restores the line, column, and position', () {
     scanner.scan('foo\nb');
-    var state = scanner.state;
+    final state = scanner.state;
 
     scanner.scan('ar\nba');
     scanner.state = state;
diff --git a/pkgs/string_scanner/test/span_scanner_test.dart b/pkgs/string_scanner/test/span_scanner_test.dart
index e2570ae..2034d0a 100644
--- a/pkgs/string_scanner/test/span_scanner_test.dart
+++ b/pkgs/string_scanner/test/span_scanner_test.dart
@@ -9,21 +9,23 @@
 import 'utils.dart';
 
 void main() {
-  testForImplementation('lazy', ([String string]) {
-    return SpanScanner(string ?? 'foo\nbar\nbaz', sourceUrl: 'source');
-  });
+  testForImplementation(
+      'lazy',
+      ([String string]) =>
+          SpanScanner(string ?? 'foo\nbar\nbaz', sourceUrl: 'source'));
 
-  testForImplementation('eager', ([String string]) {
-    return SpanScanner.eager(string ?? 'foo\nbar\nbaz', sourceUrl: 'source');
-  });
+  testForImplementation(
+      'eager',
+      ([String string]) =>
+          SpanScanner.eager(string ?? 'foo\nbar\nbaz', sourceUrl: 'source'));
 
   group('within', () {
-    var text = 'first\nbefore: foo\nbar\nbaz :after\nlast';
-    var startOffset = text.indexOf('foo');
+    const text = 'first\nbefore: foo\nbar\nbaz :after\nlast';
+    final startOffset = text.indexOf('foo');
 
     SpanScanner scanner;
     setUp(() {
-      var file = SourceFile.fromString(text, url: 'source');
+      final file = SourceFile.fromString(text, url: 'source');
       scanner =
           SpanScanner.within(file.span(startOffset, text.indexOf(' :after')));
     });
@@ -49,7 +51,7 @@
       scanner.scan('fo');
       scanner.scan('o\nba');
 
-      var span = scanner.lastSpan;
+      final span = scanner.lastSpan;
       expect(span.start.offset, equals(startOffset + 2));
       expect(span.start.line, equals(1));
       expect(span.start.column, equals(10));
@@ -65,18 +67,18 @@
 
     test('.spanFrom() returns a span from a previous state', () {
       scanner.scan('fo');
-      var state = scanner.state;
+      final state = scanner.state;
       scanner.scan('o\nba');
       scanner.scan('r\nba');
 
-      var span = scanner.spanFrom(state);
+      final span = scanner.spanFrom(state);
       expect(span.text, equals('o\nbar\nba'));
     });
 
     test('.emptySpan returns an empty span at the current location', () {
       scanner.scan('foo\nba');
 
-      var span = scanner.emptySpan;
+      final span = scanner.emptySpan;
       expect(span.start.offset, equals(startOffset + 6));
       expect(span.start.line, equals(2));
       expect(span.start.column, equals(2));
@@ -113,7 +115,7 @@
       scanner.scan('fo');
       scanner.scan('o\nba');
 
-      var span = scanner.lastSpan;
+      final span = scanner.lastSpan;
       expect(span.start.offset, equals(2));
       expect(span.start.line, equals(0));
       expect(span.start.column, equals(2));
@@ -129,27 +131,27 @@
 
     test('.spanFrom() returns a span from a previous state', () {
       scanner.scan('fo');
-      var state = scanner.state;
+      final state = scanner.state;
       scanner.scan('o\nba');
       scanner.scan('r\nba');
 
-      var span = scanner.spanFrom(state);
+      final span = scanner.spanFrom(state);
       expect(span.text, equals('o\nbar\nba'));
     });
 
     test('.spanFrom() handles surrogate pairs correctly', () {
       scanner = create('fo\u{12345}o');
       scanner.scan('fo');
-      var state = scanner.state;
+      final state = scanner.state;
       scanner.scan('\u{12345}o');
-      var span = scanner.spanFrom(state);
+      final span = scanner.spanFrom(state);
       expect(span.text, equals('\u{12345}o'));
     });
 
     test('.emptySpan returns an empty span at the current location', () {
       scanner.scan('foo\nba');
 
-      var span = scanner.emptySpan;
+      final span = scanner.emptySpan;
       expect(span.start.offset, equals(6));
       expect(span.start.line, equals(1));
       expect(span.start.column, equals(2));
diff --git a/pkgs/string_scanner/test/string_scanner_test.dart b/pkgs/string_scanner/test/string_scanner_test.dart
index e1e5b4e..9dee9d1 100644
--- a/pkgs/string_scanner/test/string_scanner_test.dart
+++ b/pkgs/string_scanner/test/string_scanner_test.dart
@@ -374,7 +374,7 @@
     });
 
     test('setting and resetting position clears lastMatch', () {
-      var oldPosition = scanner.position;
+      final oldPosition = scanner.position;
       scanner.position = 1;
       scanner.position = oldPosition;
       expect(scanner.lastMatch, isNull);
@@ -395,7 +395,7 @@
 
   group('a scanner constructed with a custom position', () {
     test('starts scanning from that position', () {
-      var scanner = StringScanner('foo bar', position: 1);
+      final scanner = StringScanner('foo bar', position: 1);
       expect(scanner.position, equals(1));
       expect(scanner.rest, equals('oo bar'));
 
