[video_player] Update app-facing package analysis options (#4786)

diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md
index adf696a..ee0accb 100644
--- a/packages/video_player/video_player/CHANGELOG.md
+++ b/packages/video_player/video_player/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.2.19
+
+* Internal code cleanup for stricter analysis options.
+
 ## 2.2.18
 
 * Moves Android and iOS implementations to federated packages.
diff --git a/packages/video_player/video_player/analysis_options.yaml b/packages/video_player/video_player/analysis_options.yaml
deleted file mode 100644
index 5aeb4e7..0000000
--- a/packages/video_player/video_player/analysis_options.yaml
+++ /dev/null
@@ -1 +0,0 @@
-include: ../../../analysis_options_legacy.yaml
diff --git a/packages/video_player/video_player/example/integration_test/controller_swap_test.dart b/packages/video_player/video_player/example/integration_test/controller_swap_test.dart
index 8478076..f80e600 100644
--- a/packages/video_player/video_player/example/integration_test/controller_swap_test.dart
+++ b/packages/video_player/video_player/example/integration_test/controller_swap_test.dart
@@ -6,8 +6,8 @@
 
 import 'package:flutter/foundation.dart';
 import 'package:flutter/material.dart';
-import 'package:integration_test/integration_test.dart';
 import 'package:flutter_test/flutter_test.dart';
+import 'package:integration_test/integration_test.dart';
 import 'package:video_player/video_player.dart';
 
 const Duration _playDuration = Duration(seconds: 1);
@@ -18,13 +18,13 @@
     'can substitute one controller by another without crashing',
     (WidgetTester tester) async {
       // Use WebM for web to allow CI to use Chromium.
-      final String videoAssetKey =
+      const String videoAssetKey =
           kIsWeb ? 'assets/Butterfly-209.webm' : 'assets/Butterfly-209.mp4';
 
-      VideoPlayerController controller = VideoPlayerController.asset(
+      final VideoPlayerController controller = VideoPlayerController.asset(
         videoAssetKey,
       );
-      VideoPlayerController another = VideoPlayerController.asset(
+      final VideoPlayerController another = VideoPlayerController.asset(
         videoAssetKey,
       );
       await controller.initialize();
@@ -32,18 +32,16 @@
       await controller.setVolume(0);
       await another.setVolume(0);
 
-      final Completer<void> started = Completer();
-      final Completer<void> ended = Completer();
-      bool startedBuffering = false;
-      bool endedBuffering = false;
+      final Completer<void> started = Completer<void>();
+      final Completer<void> ended = Completer<void>();
 
       another.addListener(() {
-        if (another.value.isBuffering && !startedBuffering) {
-          startedBuffering = true;
+        if (another.value.isBuffering && !started.isCompleted) {
           started.complete();
         }
-        if (startedBuffering && !another.value.isBuffering && !endedBuffering) {
-          endedBuffering = true;
+        if (started.isCompleted &&
+            !another.value.isBuffering &&
+            !ended.isCompleted) {
           ended.complete();
         }
       });
@@ -69,11 +67,8 @@
       expect(another.value.position,
           (Duration position) => position > const Duration(seconds: 0));
 
-      await started;
-      expect(startedBuffering, true);
-
-      await ended;
-      expect(endedBuffering, true);
+      await expectLater(started.future, completes);
+      await expectLater(ended.future, completes);
     },
     skip: !(kIsWeb || defaultTargetPlatform == TargetPlatform.android),
   );
@@ -86,7 +81,7 @@
       textDirection: TextDirection.ltr,
       child: Center(
         child: AspectRatio(
-          key: Key('same'),
+          key: const Key('same'),
           aspectRatio: controller.value.aspectRatio,
           child: VideoPlayer(controller),
         ),
diff --git a/packages/video_player/video_player/example/integration_test/video_player_test.dart b/packages/video_player/video_player/example/integration_test/video_player_test.dart
index 0c2252b..746c63f 100644
--- a/packages/video_player/video_player/example/integration_test/video_player_test.dart
+++ b/packages/video_player/video_player/example/integration_test/video_player_test.dart
@@ -17,7 +17,7 @@
 const Duration _playDuration = Duration(seconds: 1);
 
 // Use WebM for web to allow CI to use Chromium.
-final String _videoAssetKey =
+const String _videoAssetKey =
     kIsWeb ? 'assets/Butterfly-209.webm' : 'assets/Butterfly-209.mp4';
 
 // Returns the URL to load an asset from this example app as a network source.
@@ -48,13 +48,14 @@
       expect(_controller.value.isPlaying, false);
       // The WebM version has a slightly different duration than the MP4.
       expect(_controller.value.duration,
-          Duration(seconds: 7, milliseconds: kIsWeb ? 544 : 540));
+          const Duration(seconds: 7, milliseconds: kIsWeb ? 544 : 540));
     });
 
     testWidgets(
       'live stream duration != 0',
       (WidgetTester tester) async {
-        VideoPlayerController networkController = VideoPlayerController.network(
+        final VideoPlayerController networkController =
+            VideoPlayerController.network(
           'https://cph-p2p-msl.akamaized.net/hls/live/2000341/test/master.m3u8',
         );
         await networkController.initialize();
@@ -65,7 +66,7 @@
         expect(networkController.value.duration,
             (Duration duration) => duration != Duration.zero);
       },
-      skip: (kIsWeb),
+      skip: kIsWeb,
     );
 
     testWidgets(
@@ -124,7 +125,7 @@
         // Mute to allow playing without DOM interaction on Web.
         // See https://developers.google.com/web/updates/2017/09/autoplay-policy-changes
         await _controller.setVolume(0);
-        Duration tenMillisBeforeEnd =
+        final Duration tenMillisBeforeEnd =
             _controller.value.duration - const Duration(milliseconds: 10);
         await _controller.seekTo(tenMillisBeforeEnd);
         await _controller.play();
@@ -203,12 +204,12 @@
   group('file-based videos', () {
     setUp(() async {
       // Load the data from the asset.
-      String tempDir = (await getTemporaryDirectory()).path;
-      ByteData bytes = await rootBundle.load(_videoAssetKey);
+      final String tempDir = (await getTemporaryDirectory()).path;
+      final ByteData bytes = await rootBundle.load(_videoAssetKey);
 
       // Write it to a file to use as a source.
       final String filename = _videoAssetKey.split('/').last;
-      File file = File('$tempDir/$filename');
+      final File file = File('$tempDir/$filename');
       await file.writeAsBytes(bytes.buffer.asInt8List());
 
       _controller = VideoPlayerController.file(file);
@@ -244,8 +245,8 @@
         // Mute to allow playing without DOM interaction on Web.
         // See https://developers.google.com/web/updates/2017/09/autoplay-policy-changes
         await _controller.setVolume(0);
-        final Completer<void> started = Completer();
-        final Completer<void> ended = Completer();
+        final Completer<void> started = Completer<void>();
+        final Completer<void> ended = Completer<void>();
         _controller.addListener(() {
           if (!started.isCompleted && _controller.value.isBuffering) {
             started.complete();
@@ -291,7 +292,7 @@
       // The audio was made with 44100 Hz, 192 Kbps CBR, and 32 bits.
       expect(
         _controller.value.duration,
-        Duration(seconds: 5, milliseconds: kIsWeb ? 42 : 41),
+        const Duration(seconds: 5, milliseconds: kIsWeb ? 42 : 41),
       );
     });
 
diff --git a/packages/video_player/video_player/example/lib/main.dart b/packages/video_player/video_player/example/lib/main.dart
index 9297cc6..5d496a9 100644
--- a/packages/video_player/video_player/example/lib/main.dart
+++ b/packages/video_player/video_player/example/lib/main.dart
@@ -47,10 +47,10 @@
             tabs: <Widget>[
               Tab(
                 icon: Icon(Icons.cloud),
-                text: "Remote",
+                text: 'Remote',
               ),
-              Tab(icon: Icon(Icons.insert_drive_file), text: "Asset"),
-              Tab(icon: Icon(Icons.list), text: "List example"),
+              Tab(icon: Icon(Icons.insert_drive_file), text: 'Asset'),
+              Tab(icon: Icon(Icons.list), text: 'List example'),
             ],
           ),
         ),
@@ -71,20 +71,20 @@
   Widget build(BuildContext context) {
     return ListView(
       children: <Widget>[
-        _ExampleCard(title: "Item a"),
-        _ExampleCard(title: "Item b"),
-        _ExampleCard(title: "Item c"),
-        _ExampleCard(title: "Item d"),
-        _ExampleCard(title: "Item e"),
-        _ExampleCard(title: "Item f"),
-        _ExampleCard(title: "Item g"),
+        const _ExampleCard(title: 'Item a'),
+        const _ExampleCard(title: 'Item b'),
+        const _ExampleCard(title: 'Item c'),
+        const _ExampleCard(title: 'Item d'),
+        const _ExampleCard(title: 'Item e'),
+        const _ExampleCard(title: 'Item f'),
+        const _ExampleCard(title: 'Item g'),
         Card(
             child: Column(children: <Widget>[
           Column(
             children: <Widget>[
               const ListTile(
                 leading: Icon(Icons.cake),
-                title: Text("Video video"),
+                title: Text('Video video'),
               ),
               Stack(
                   alignment: FractionalOffset.bottomRight +
@@ -96,11 +96,11 @@
             ],
           ),
         ])),
-        _ExampleCard(title: "Item h"),
-        _ExampleCard(title: "Item i"),
-        _ExampleCard(title: "Item j"),
-        _ExampleCard(title: "Item k"),
-        _ExampleCard(title: "Item l"),
+        const _ExampleCard(title: 'Item h'),
+        const _ExampleCard(title: 'Item i'),
+        const _ExampleCard(title: 'Item j'),
+        const _ExampleCard(title: 'Item k'),
+        const _ExampleCard(title: 'Item l'),
       ],
     );
   }
@@ -269,7 +269,7 @@
   const _ControlsOverlay({Key? key, required this.controller})
       : super(key: key);
 
-  static const _exampleCaptionOffsets = [
+  static const List<Duration> _exampleCaptionOffsets = <Duration>[
     Duration(seconds: -10),
     Duration(seconds: -3),
     Duration(seconds: -1, milliseconds: -500),
@@ -280,7 +280,7 @@
     Duration(seconds: 3),
     Duration(seconds: 10),
   ];
-  static const _examplePlaybackRates = [
+  static const List<double> _examplePlaybackRates = <double>[
     0.25,
     0.5,
     1.0,
@@ -298,13 +298,13 @@
     return Stack(
       children: <Widget>[
         AnimatedSwitcher(
-          duration: Duration(milliseconds: 50),
-          reverseDuration: Duration(milliseconds: 200),
+          duration: const Duration(milliseconds: 50),
+          reverseDuration: const Duration(milliseconds: 200),
           child: controller.value.isPlaying
-              ? SizedBox.shrink()
+              ? const SizedBox.shrink()
               : Container(
                   color: Colors.black26,
-                  child: Center(
+                  child: const Center(
                     child: Icon(
                       Icons.play_arrow,
                       color: Colors.white,
@@ -324,13 +324,13 @@
           child: PopupMenuButton<Duration>(
             initialValue: controller.value.captionOffset,
             tooltip: 'Caption Offset',
-            onSelected: (delay) {
+            onSelected: (Duration delay) {
               controller.setCaptionOffset(delay);
             },
-            itemBuilder: (context) {
-              return [
-                for (final offsetDuration in _exampleCaptionOffsets)
-                  PopupMenuItem(
+            itemBuilder: (BuildContext context) {
+              return <PopupMenuItem<Duration>>[
+                for (final Duration offsetDuration in _exampleCaptionOffsets)
+                  PopupMenuItem<Duration>(
                     value: offsetDuration,
                     child: Text('${offsetDuration.inMilliseconds}ms'),
                   )
@@ -353,13 +353,13 @@
           child: PopupMenuButton<double>(
             initialValue: controller.value.playbackSpeed,
             tooltip: 'Playback speed',
-            onSelected: (speed) {
+            onSelected: (double speed) {
               controller.setPlaybackSpeed(speed);
             },
-            itemBuilder: (context) {
-              return [
-                for (final speed in _examplePlaybackRates)
-                  PopupMenuItem(
+            itemBuilder: (BuildContext context) {
+              return <PopupMenuItem<double>>[
+                for (final double speed in _examplePlaybackRates)
+                  PopupMenuItem<double>(
                     value: speed,
                     child: Text('${speed}x'),
                   )
diff --git a/packages/video_player/video_player/example/pubspec.yaml b/packages/video_player/video_player/example/pubspec.yaml
index eef6eb7..6032f3c 100644
--- a/packages/video_player/video_player/example/pubspec.yaml
+++ b/packages/video_player/video_player/example/pubspec.yaml
@@ -18,14 +18,13 @@
     path: ../
 
 dev_dependencies:
-  flutter_test:
-    sdk: flutter
   flutter_driver:
     sdk: flutter
+  flutter_test:
+    sdk: flutter
   integration_test:
     sdk: flutter
   path_provider: ^2.0.6
-  pedantic: ^1.10.0
   test: any
 
 flutter:
diff --git a/packages/video_player/video_player/example/test_driver/video_player_test.dart b/packages/video_player/video_player/example/test_driver/video_player_test.dart
index 1d5ac79..5fbed80 100644
--- a/packages/video_player/video_player/example/test_driver/video_player_test.dart
+++ b/packages/video_player/video_player/example/test_driver/video_player_test.dart
@@ -12,8 +12,8 @@
     await driver.close();
   });
 
-  //TODO(cyanglaz): Use TabBar tabs to navigate between pages after https://github.com/flutter/flutter/issues/16991 is fixed.
-  //TODO(cyanglaz): Un-skip the test after https://github.com/flutter/flutter/issues/43012 is fixed
+  // TODO(cyanglaz): Use TabBar tabs to navigate between pages after https://github.com/flutter/flutter/issues/16991 is fixed.
+  // TODO(cyanglaz): Un-skip the test after https://github.com/flutter/flutter/issues/43012 is fixed
   test('Push a page contains video and pop back, do not crash.', () async {
     final SerializableFinder pushTab = find.byValueKey('push_tab');
     await driver.waitFor(pushTab);
diff --git a/packages/video_player/video_player/lib/src/closed_caption_file.dart b/packages/video_player/video_player/lib/src/closed_caption_file.dart
index e410e26..324ffc4 100644
--- a/packages/video_player/video_player/lib/src/closed_caption_file.dart
+++ b/packages/video_player/video_player/lib/src/closed_caption_file.dart
@@ -2,10 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import 'sub_rip.dart';
-export 'sub_rip.dart' show SubRipCaptionFile;
+import 'package:flutter/foundation.dart' show objectRuntimeType;
 
+import 'sub_rip.dart';
 import 'web_vtt.dart';
+
+export 'sub_rip.dart' show SubRipCaptionFile;
 export 'web_vtt.dart' show WebVTTCaptionFile;
 
 /// A structured representation of a parsed closed caption file.
@@ -66,7 +68,7 @@
 
   @override
   String toString() {
-    return '$runtimeType('
+    return '${objectRuntimeType(this, 'Caption')}('
         'number: $number, '
         'start: $start, '
         'end: $end, '
diff --git a/packages/video_player/video_player/lib/src/sub_rip.dart b/packages/video_player/video_player/lib/src/sub_rip.dart
index 5d6863f..7b807cd 100644
--- a/packages/video_player/video_player/lib/src/sub_rip.dart
+++ b/packages/video_player/video_player/lib/src/sub_rip.dart
@@ -28,8 +28,10 @@
 
 List<Caption> _parseCaptionsFromSubRipString(String file) {
   final List<Caption> captions = <Caption>[];
-  for (List<String> captionLines in _readSubRipFile(file)) {
-    if (captionLines.length < 3) break;
+  for (final List<String> captionLines in _readSubRipFile(file)) {
+    if (captionLines.length < 3) {
+      break;
+    }
 
     final int captionNumber = int.parse(captionLines[0]);
     final _CaptionRange captionRange =
@@ -52,11 +54,11 @@
 }
 
 class _CaptionRange {
+  _CaptionRange(this.start, this.end);
+
   final Duration start;
   final Duration end;
 
-  _CaptionRange(this.start, this.end);
-
   // Assumes format from an SubRip file.
   // For example:
   // 00:01:54,724 --> 00:01:56,760
diff --git a/packages/video_player/video_player/lib/src/web_vtt.dart b/packages/video_player/video_player/lib/src/web_vtt.dart
index 6c4527d..5527e62 100644
--- a/packages/video_player/video_player/lib/src/web_vtt.dart
+++ b/packages/video_player/video_player/lib/src/web_vtt.dart
@@ -5,9 +5,9 @@
 import 'dart:convert';
 
 import 'package:html/dom.dart';
+import 'package:html/parser.dart' as html_parser;
 
 import 'closed_caption_file.dart';
-import 'package:html/parser.dart' as html_parser;
 
 /// Represents a [ClosedCaptionFile], parsed from the WebVTT file format.
 /// See: https://en.wikipedia.org/wiki/WebVTT
@@ -28,10 +28,10 @@
   final List<Caption> captions = <Caption>[];
 
   // Ignore metadata
-  Set<String> metadata = {'HEADER', 'NOTE', 'REGION', 'WEBVTT'};
+  final Set<String> metadata = <String>{'HEADER', 'NOTE', 'REGION', 'WEBVTT'};
 
   int captionNumber = 1;
-  for (List<String> captionLines in _readWebVTTFile(file)) {
+  for (final List<String> captionLines in _readWebVTTFile(file)) {
     // CaptionLines represent a complete caption.
     // E.g
     // [
@@ -39,14 +39,18 @@
     //  ['Introduction']
     // ]
     // If caption has just header or time, but no text, `captionLines.length` will be 1.
-    if (captionLines.length < 2) continue;
+    if (captionLines.length < 2) {
+      continue;
+    }
 
     // If caption has header equal metadata, ignore.
-    String metadaType = captionLines[0].split(' ')[0];
-    if (metadata.contains(metadaType)) continue;
+    final String metadaType = captionLines[0].split(' ')[0];
+    if (metadata.contains(metadaType)) {
+      continue;
+    }
 
     // Caption has header
-    bool hasHeader = captionLines.length > 2;
+    final bool hasHeader = captionLines.length > 2;
     if (hasHeader) {
       final int? tryParseCaptionNumber = int.tryParse(captionLines[0]);
       if (tryParseCaptionNumber != null) {
@@ -82,11 +86,11 @@
 }
 
 class _CaptionRange {
+  _CaptionRange(this.start, this.end);
+
   final Duration start;
   final Duration end;
 
-  _CaptionRange(this.start, this.end);
-
   // Assumes format from an VTT file.
   // For example:
   // 00:09.000 --> 00:11.000
@@ -161,7 +165,7 @@
     return null;
   }
 
-  List<String> milisecondsStyles = dotSections[1].split(" ");
+  final List<String> milisecondsStyles = dotSections[1].split(' ');
 
   // TODO(cyanglaz): Handle caption styles.
   // https://github.com/flutter/flutter/issues/90009.
@@ -172,7 +176,7 @@
   // ```
   // For a better readable code style, style parsing should happen before
   // calling this method. See: https://github.com/flutter/plugins/pull/2878/files#r713381134.
-  int milliseconds = int.parse(milisecondsStyles[0]);
+  final int milliseconds = int.parse(milisecondsStyles[0]);
 
   return Duration(
     hours: hours,
diff --git a/packages/video_player/video_player/lib/video_player.dart b/packages/video_player/video_player/lib/video_player.dart
index 8fd2162..672ba2e 100644
--- a/packages/video_player/video_player/lib/video_player.dart
+++ b/packages/video_player/video_player/lib/video_player.dart
@@ -10,16 +10,17 @@
 import 'package:flutter/services.dart';
 import 'package:video_player_platform_interface/video_player_platform_interface.dart';
 
+import 'src/closed_caption_file.dart';
+
 export 'package:video_player_platform_interface/video_player_platform_interface.dart'
     show DurationRange, DataSourceType, VideoFormat, VideoPlayerOptions;
 
-import 'src/closed_caption_file.dart';
 export 'src/closed_caption_file.dart';
 
 VideoPlayerPlatform? _lastVideoPlayerPlatform;
 
 VideoPlayerPlatform get _videoPlayerPlatform {
-  VideoPlayerPlatform currentInstance = VideoPlayerPlatform.instance;
+  final VideoPlayerPlatform currentInstance = VideoPlayerPlatform.instance;
   if (_lastVideoPlayerPlatform != currentInstance) {
     // This will clear all open videos on the platform when a full restart is
     // performed.
@@ -32,10 +33,6 @@
 /// The duration, current position, buffering state, error state and settings
 /// of a [VideoPlayerController].
 class VideoPlayerValue {
-  /// This constant is just to indicate that parameter is not passed to [copyWith]
-  /// workaround for this issue https://github.com/dart-lang/language/issues/2009
-  static const _defaultErrorDescription = 'defaultErrorDescription';
-
   /// Constructs a video with the given values. Only [duration] is required. The
   /// rest will initialize with default values when unset.
   VideoPlayerValue({
@@ -65,6 +62,10 @@
             isInitialized: false,
             errorDescription: errorDescription);
 
+  /// This constant is just to indicate that parameter is not passed to [copyWith]
+  /// workaround for this issue https://github.com/dart-lang/language/issues/2009
+  static const String _defaultErrorDescription = 'defaultErrorDescription';
+
   /// The total duration of the video.
   ///
   /// The duration is [Duration.zero] if the video hasn't been initialized.
@@ -172,7 +173,7 @@
 
   @override
   String toString() {
-    return '$runtimeType('
+    return '${objectRuntimeType(this, 'VideoPlayerValue')}('
         'duration: $duration, '
         'size: $size, '
         'position: $position, '
@@ -209,7 +210,7 @@
       {this.package, this.closedCaptionFile, this.videoPlayerOptions})
       : dataSourceType = DataSourceType.asset,
         formatHint = null,
-        httpHeaders = const {},
+        httpHeaders = const <String, String>{},
         super(VideoPlayerValue(duration: Duration.zero));
 
   /// Constructs a [VideoPlayerController] playing a video from obtained from
@@ -226,7 +227,7 @@
     this.formatHint,
     this.closedCaptionFile,
     this.videoPlayerOptions,
-    this.httpHeaders = const {},
+    this.httpHeaders = const <String, String>{},
   })  : dataSourceType = DataSourceType.network,
         package = null,
         super(VideoPlayerValue(duration: Duration.zero));
@@ -241,7 +242,7 @@
         dataSourceType = DataSourceType.file,
         package = null,
         formatHint = null,
-        httpHeaders = const {},
+        httpHeaders = const <String, String>{},
         super(VideoPlayerValue(duration: Duration.zero));
 
   /// Constructs a [VideoPlayerController] playing a video from a contentUri.
@@ -256,7 +257,7 @@
         dataSourceType = DataSourceType.contentUri,
         package = null,
         formatHint = null,
-        httpHeaders = const {},
+        httpHeaders = const <String, String>{},
         super(VideoPlayerValue(duration: Duration.zero));
 
   /// The URI to the video file. This will be in different formats depending on
@@ -393,9 +394,7 @@
     }
 
     if (closedCaptionFile != null) {
-      if (_closedCaptionFile == null) {
-        _closedCaptionFile = await closedCaptionFile;
-      }
+      _closedCaptionFile ??= await closedCaptionFile;
       value = value.copyWith(caption: _getCaptionAt(value.position));
     }
 
@@ -513,7 +512,9 @@
     // Setting the playback speed on iOS will trigger the video to play. We
     // prevent this from happening by not applying the playback speed until
     // the video is manually played from Flutter.
-    if (!value.isPlaying) return;
+    if (!value.isPlaying) {
+      return;
+    }
 
     await _videoPlayerPlatform.setPlaybackSpeed(
       _textureId,
@@ -618,9 +619,9 @@
       return Caption.none;
     }
 
-    final delayedPosition = position + value.captionOffset;
-    // TODO: This would be more efficient as a binary search.
-    for (final caption in _closedCaptionFile!.captions) {
+    final Duration delayedPosition = position + value.captionOffset;
+    // TODO(johnsonmh): This would be more efficient as a binary search.
+    for (final Caption caption in _closedCaptionFile!.captions) {
       if (caption.start <= delayedPosition && caption.end >= delayedPosition) {
         return caption;
       }
@@ -682,7 +683,7 @@
 /// Widget that displays the video controlled by [controller].
 class VideoPlayer extends StatefulWidget {
   /// Uses the given [controller] for all video rendered in this widget.
-  VideoPlayer(this.controller);
+  const VideoPlayer(this.controller);
 
   /// The [VideoPlayerController] responsible for the video being rendered in
   /// this widget.
@@ -780,7 +781,7 @@
 }
 
 class _VideoScrubber extends StatefulWidget {
-  _VideoScrubber({
+  const _VideoScrubber({
     required this.child,
     required this.controller,
   });
@@ -800,7 +801,7 @@
   @override
   Widget build(BuildContext context) {
     void seekToRelativePosition(Offset globalPosition) {
-      final RenderBox box = context.findRenderObject() as RenderBox;
+      final RenderBox box = context.findRenderObject()! as RenderBox;
       final Offset tapPos = box.globalToLocal(globalPosition);
       final double relative = tapPos.dx / box.size.width;
       final Duration position = controller.value.duration * relative;
@@ -855,7 +856,7 @@
   /// Defaults will be used for everything except [controller] if they're not
   /// provided. [allowScrubbing] defaults to false, and [padding] will default
   /// to `top: 5.0`.
-  VideoProgressIndicator(
+  const VideoProgressIndicator(
     this.controller, {
     this.colors = const VideoProgressColors(),
     required this.allowScrubbing,
@@ -923,7 +924,7 @@
       final int position = controller.value.position.inMilliseconds;
 
       int maxBuffering = 0;
-      for (DurationRange range in controller.value.buffered) {
+      for (final DurationRange range in controller.value.buffered) {
         final int end = range.end.inMilliseconds;
         if (end > maxBuffering) {
           maxBuffering = end;
@@ -1005,9 +1006,9 @@
 
   @override
   Widget build(BuildContext context) {
-    final text = this.text;
+    final String? text = this.text;
     if (text == null || text.isEmpty) {
-      return SizedBox.shrink();
+      return const SizedBox.shrink();
     }
 
     final TextStyle effectiveTextStyle = textStyle ??
@@ -1019,14 +1020,14 @@
     return Align(
       alignment: Alignment.bottomCenter,
       child: Padding(
-        padding: EdgeInsets.only(bottom: 24.0),
+        padding: const EdgeInsets.only(bottom: 24.0),
         child: DecoratedBox(
           decoration: BoxDecoration(
-            color: Color(0xB8000000),
+            color: const Color(0xB8000000),
             borderRadius: BorderRadius.circular(2.0),
           ),
           child: Padding(
-            padding: EdgeInsets.symmetric(horizontal: 2.0),
+            padding: const EdgeInsets.symmetric(horizontal: 2.0),
             child: Text(text, style: effectiveTextStyle),
           ),
         ),
diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml
index a444fc6..2f6e289 100644
--- a/packages/video_player/video_player/pubspec.yaml
+++ b/packages/video_player/video_player/pubspec.yaml
@@ -3,7 +3,7 @@
   widgets on Android, iOS, and web.
 repository: https://github.com/flutter/plugins/tree/main/packages/video_player/video_player
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+video_player%22
-version: 2.2.18
+version: 2.2.19
 
 environment:
   sdk: ">=2.14.0 <3.0.0"
@@ -22,13 +22,12 @@
 dependencies:
   flutter:
     sdk: flutter
+  html: ^0.15.0
   video_player_android: ^2.2.17
   video_player_avfoundation: ^2.2.17
   video_player_platform_interface: ">=4.2.0 <6.0.0"
   video_player_web: ^2.0.0
-  html: ^0.15.0
 
 dev_dependencies:
   flutter_test:
     sdk: flutter
-  pedantic: ^1.10.0
diff --git a/packages/video_player/video_player/test/closed_caption_file_test.dart b/packages/video_player/video_player/test/closed_caption_file_test.dart
index 369a3b3..b5c0a8e 100644
--- a/packages/video_player/video_player/test/closed_caption_file_test.dart
+++ b/packages/video_player/video_player/test/closed_caption_file_test.dart
@@ -8,7 +8,7 @@
 void main() {
   group('ClosedCaptionFile', () {
     test('toString()', () {
-      final Caption caption = const Caption(
+      const Caption caption = Caption(
         number: 1,
         start: Duration(seconds: 1),
         end: Duration(seconds: 2),
diff --git a/packages/video_player/video_player/test/sub_rip_file_test.dart b/packages/video_player/video_player/test/sub_rip_file_test.dart
index 5808e0b..ea3bfda 100644
--- a/packages/video_player/video_player/test/sub_rip_file_test.dart
+++ b/packages/video_player/video_player/test/sub_rip_file_test.dart
@@ -14,19 +14,19 @@
 
     final Caption firstCaption = parsedFile.captions.first;
     expect(firstCaption.number, 1);
-    expect(firstCaption.start, Duration(seconds: 6));
-    expect(firstCaption.end, Duration(seconds: 12, milliseconds: 74));
+    expect(firstCaption.start, const Duration(seconds: 6));
+    expect(firstCaption.end, const Duration(seconds: 12, milliseconds: 74));
     expect(firstCaption.text, 'This is a test file');
 
     final Caption secondCaption = parsedFile.captions[1];
     expect(secondCaption.number, 2);
     expect(
       secondCaption.start,
-      Duration(minutes: 1, seconds: 54, milliseconds: 724),
+      const Duration(minutes: 1, seconds: 54, milliseconds: 724),
     );
     expect(
       secondCaption.end,
-      Duration(minutes: 1, seconds: 56, milliseconds: 760),
+      const Duration(minutes: 1, seconds: 56, milliseconds: 760),
     );
     expect(secondCaption.text, '- Hello.\n- Yes?');
 
@@ -34,11 +34,11 @@
     expect(thirdCaption.number, 3);
     expect(
       thirdCaption.start,
-      Duration(minutes: 1, seconds: 56, milliseconds: 884),
+      const Duration(minutes: 1, seconds: 56, milliseconds: 884),
     );
     expect(
       thirdCaption.end,
-      Duration(minutes: 1, seconds: 58, milliseconds: 954),
+      const Duration(minutes: 1, seconds: 58, milliseconds: 954),
     );
     expect(
       thirdCaption.text,
@@ -49,11 +49,11 @@
     expect(fourthCaption.number, 4);
     expect(
       fourthCaption.start,
-      Duration(hours: 1, minutes: 1, seconds: 59, milliseconds: 84),
+      const Duration(hours: 1, minutes: 1, seconds: 59, milliseconds: 84),
     );
     expect(
       fourthCaption.end,
-      Duration(hours: 1, minutes: 2, seconds: 1, milliseconds: 552),
+      const Duration(hours: 1, minutes: 2, seconds: 1, milliseconds: 552),
     );
     expect(
       fourthCaption.text,
@@ -68,8 +68,8 @@
 
     final Caption firstCaption = parsedFile.captions.single;
     expect(firstCaption.number, 2);
-    expect(firstCaption.start, Duration(seconds: 15));
-    expect(firstCaption.end, Duration(seconds: 17, milliseconds: 74));
+    expect(firstCaption.start, const Duration(seconds: 15));
+    expect(firstCaption.end, const Duration(seconds: 17, milliseconds: 74));
     expect(firstCaption.text, 'This one is valid');
   });
 }
diff --git a/packages/video_player/video_player/test/video_player_initialization_test.dart b/packages/video_player/video_player/test/video_player_initialization_test.dart
index 1870934..af0886f 100644
--- a/packages/video_player/video_player/test/video_player_initialization_test.dart
+++ b/packages/video_player/video_player/test/video_player_initialization_test.dart
@@ -13,7 +13,8 @@
   // in this file.
   test('plugin initialized', () async {
     TestWidgetsFlutterBinding.ensureInitialized();
-    FakeVideoPlayerPlatform fakeVideoPlayerPlatform = FakeVideoPlayerPlatform();
+    final FakeVideoPlayerPlatform fakeVideoPlayerPlatform =
+        FakeVideoPlayerPlatform();
     VideoPlayerPlatform.instance = fakeVideoPlayerPlatform;
 
     final VideoPlayerController controller = VideoPlayerController.network(
diff --git a/packages/video_player/video_player/test/video_player_test.dart b/packages/video_player/video_player/test/video_player_test.dart
index 3bce821..07afd0f 100644
--- a/packages/video_player/video_player/test/video_player_test.dart
+++ b/packages/video_player/video_player/test/video_player_test.dart
@@ -29,7 +29,7 @@
   String get dataSource => '';
 
   @override
-  Map<String, String> get httpHeaders => {};
+  Map<String, String> get httpHeaders => <String, String>{};
 
   @override
   DataSourceType get dataSourceType => DataSourceType.file;
@@ -81,13 +81,13 @@
   @override
   List<Caption> get captions {
     return <Caption>[
-      Caption(
+      const Caption(
         text: 'one',
         number: 0,
         start: Duration(milliseconds: 100),
         end: Duration(milliseconds: 200),
       ),
-      Caption(
+      const Caption(
         text: 'two',
         number: 1,
         start: Duration(milliseconds: 300),
@@ -135,8 +135,9 @@
 
   group('ClosedCaption widget', () {
     testWidgets('uses a default text style', (WidgetTester tester) async {
-      final String text = 'foo';
-      await tester.pumpWidget(MaterialApp(home: ClosedCaption(text: text)));
+      const String text = 'foo';
+      await tester
+          .pumpWidget(const MaterialApp(home: ClosedCaption(text: text)));
 
       final Text textWidget = tester.widget<Text>(find.text(text));
       expect(textWidget.style!.fontSize, 36.0);
@@ -144,9 +145,9 @@
     });
 
     testWidgets('uses given text and style', (WidgetTester tester) async {
-      final String text = 'foo';
-      final TextStyle textStyle = TextStyle(fontSize: 14.725);
-      await tester.pumpWidget(MaterialApp(
+      const String text = 'foo';
+      const TextStyle textStyle = TextStyle(fontSize: 14.725);
+      await tester.pumpWidget(const MaterialApp(
         home: ClosedCaption(
           text: text,
           textStyle: textStyle,
@@ -159,19 +160,20 @@
     });
 
     testWidgets('handles null text', (WidgetTester tester) async {
-      await tester.pumpWidget(MaterialApp(home: ClosedCaption(text: null)));
+      await tester
+          .pumpWidget(const MaterialApp(home: ClosedCaption(text: null)));
       expect(find.byType(Text), findsNothing);
     });
 
     testWidgets('handles empty text', (WidgetTester tester) async {
-      await tester.pumpWidget(MaterialApp(home: ClosedCaption(text: '')));
+      await tester.pumpWidget(const MaterialApp(home: ClosedCaption(text: '')));
       expect(find.byType(Text), findsNothing);
     });
 
     testWidgets('Passes text contrast ratio guidelines',
         (WidgetTester tester) async {
-      final String text = 'foo';
-      await tester.pumpWidget(MaterialApp(
+      const String text = 'foo';
+      await tester.pumpWidget(const MaterialApp(
         home: Scaffold(
           backgroundColor: Colors.white,
           body: ClosedCaption(text: text),
@@ -218,7 +220,7 @@
         );
         expect(
           fakeVideoPlayerPlatform.dataSources[0].httpHeaders,
-          {},
+          <String, String>{},
         );
       });
 
@@ -246,7 +248,7 @@
       test('network with some headers', () async {
         final VideoPlayerController controller = VideoPlayerController.network(
           'https://127.0.0.1',
-          httpHeaders: {'Authorization': 'Bearer token'},
+          httpHeaders: <String, String>{'Authorization': 'Bearer token'},
         );
         await controller.initialize();
 
@@ -260,7 +262,7 @@
         );
         expect(
           fakeVideoPlayerPlatform.dataSources[0].httpHeaders,
-          {'Authorization': 'Bearer token'},
+          <String, String>{'Authorization': 'Bearer token'},
         );
       });
 
@@ -269,10 +271,10 @@
           'http://testing.com/invalid_url',
         );
 
-        late dynamic error;
+        late Object error;
         fakeVideoPlayerPlatform.forceInitError = true;
-        await controller.initialize().catchError((dynamic e) => error = e);
-        final PlatformException platformEx = error;
+        await controller.initialize().catchError((Object e) => error = e);
+        final PlatformException platformEx = error as PlatformException;
         expect(platformEx.code, equals('VideoError'));
       });
 
@@ -493,7 +495,7 @@
           'https://127.0.0.1',
         );
         await controller.initialize();
-        final progressWidget =
+        final VideoProgressIndicator progressWidget =
             VideoProgressIndicator(controller, allowScrubbing: true);
 
         await tester.pumpWidget(Directionality(
@@ -505,7 +507,7 @@
         expect(controller.value.isPlaying, isTrue);
 
         final Rect progressRect = tester.getRect(find.byWidget(progressWidget));
-        await tester.dragFrom(progressRect.center, Offset(1.0, 0.0));
+        await tester.dragFrom(progressRect.center, const Offset(1.0, 0.0));
         await tester.pumpAndSettle();
 
         expect(controller.value.position, lessThan(controller.value.duration));
@@ -520,7 +522,7 @@
           'https://127.0.0.1',
         );
         await controller.initialize();
-        final progressWidget =
+        final VideoProgressIndicator progressWidget =
             VideoProgressIndicator(controller, allowScrubbing: true);
 
         await tester.pumpWidget(Directionality(
@@ -580,7 +582,7 @@
         );
 
         await controller.initialize();
-        controller.setCaptionOffset(Duration(milliseconds: 100));
+        controller.setCaptionOffset(const Duration(milliseconds: 100));
         expect(controller.value.position, const Duration());
         expect(controller.value.caption.text, '');
 
@@ -616,7 +618,7 @@
         );
 
         await controller.initialize();
-        controller.setCaptionOffset(Duration(milliseconds: -100));
+        controller.setCaptionOffset(const Duration(milliseconds: -100));
         expect(controller.value.position, const Duration());
         expect(controller.value.caption.text, '');
 
@@ -688,12 +690,11 @@
 
         const Duration bufferStart = Duration(seconds: 0);
         const Duration bufferEnd = Duration(milliseconds: 500);
-        fakeVideoEventStream
-          ..add(VideoEvent(
-              eventType: VideoEventType.bufferingUpdate,
-              buffered: <DurationRange>[
-                DurationRange(bufferStart, bufferEnd),
-              ]));
+        fakeVideoEventStream.add(VideoEvent(
+            eventType: VideoEventType.bufferingUpdate,
+            buffered: <DurationRange>[
+              DurationRange(bufferStart, bufferEnd),
+            ]));
         await tester.pumpAndSettle();
         expect(controller.value.isBuffering, isTrue);
         expect(controller.value.buffered.length, 1);
@@ -854,45 +855,45 @@
 
     group('aspectRatio', () {
       test('640x480 -> 4:3', () {
-        final value = VideoPlayerValue(
+        final VideoPlayerValue value = VideoPlayerValue(
           isInitialized: true,
-          size: Size(640, 480),
-          duration: Duration(seconds: 1),
+          size: const Size(640, 480),
+          duration: const Duration(seconds: 1),
         );
         expect(value.aspectRatio, 4 / 3);
       });
 
       test('no size -> 1.0', () {
-        final value = VideoPlayerValue(
+        final VideoPlayerValue value = VideoPlayerValue(
           isInitialized: true,
-          duration: Duration(seconds: 1),
+          duration: const Duration(seconds: 1),
         );
         expect(value.aspectRatio, 1.0);
       });
 
       test('height = 0 -> 1.0', () {
-        final value = VideoPlayerValue(
+        final VideoPlayerValue value = VideoPlayerValue(
           isInitialized: true,
-          size: Size(640, 0),
-          duration: Duration(seconds: 1),
+          size: const Size(640, 0),
+          duration: const Duration(seconds: 1),
         );
         expect(value.aspectRatio, 1.0);
       });
 
       test('width = 0 -> 1.0', () {
-        final value = VideoPlayerValue(
+        final VideoPlayerValue value = VideoPlayerValue(
           isInitialized: true,
-          size: Size(0, 480),
-          duration: Duration(seconds: 1),
+          size: const Size(0, 480),
+          duration: const Duration(seconds: 1),
         );
         expect(value.aspectRatio, 1.0);
       });
 
       test('negative aspect ratio -> 1.0', () {
-        final value = VideoPlayerValue(
+        final VideoPlayerValue value = VideoPlayerValue(
           isInitialized: true,
-          size: Size(640, -480),
-          duration: Duration(seconds: 1),
+          size: const Size(640, -480),
+          duration: const Duration(seconds: 1),
         );
         expect(value.aspectRatio, 1.0);
       });
@@ -904,7 +905,7 @@
     const Color bufferedColor = Color.fromRGBO(0, 255, 0, 0.5);
     const Color backgroundColor = Color.fromRGBO(255, 255, 0, 0.25);
 
-    final VideoProgressColors colors = VideoProgressColors(
+    const VideoProgressColors colors = VideoProgressColors(
         playedColor: playedColor,
         bufferedColor: bufferedColor,
         backgroundColor: backgroundColor);
@@ -936,7 +937,7 @@
   @override
   Future<int?> create(DataSource dataSource) async {
     calls.add('create');
-    StreamController<VideoEvent> stream = StreamController<VideoEvent>();
+    final StreamController<VideoEvent> stream = StreamController<VideoEvent>();
     streams[nextTextureId] = stream;
     if (forceInitError) {
       stream.addError(PlatformException(
@@ -944,8 +945,8 @@
     } else {
       stream.add(VideoEvent(
           eventType: VideoEventType.initialized,
-          size: Size(100, 100),
-          duration: Duration(seconds: 1)));
+          size: const Size(100, 100),
+          duration: const Duration(seconds: 1)));
     }
     dataSources.add(dataSource);
     return nextTextureId++;
@@ -962,6 +963,7 @@
     initialized.complete(true);
   }
 
+  @override
   Stream<VideoEvent> videoEventsFor(int textureId) {
     return streams[textureId]!.stream;
   }
diff --git a/packages/video_player/video_player/test/web_vtt_test.dart b/packages/video_player/video_player/test/web_vtt_test.dart
index 59fce98..bde6292 100644
--- a/packages/video_player/video_player/test/web_vtt_test.dart
+++ b/packages/video_player/video_player/test/web_vtt_test.dart
@@ -14,9 +14,9 @@
       parsedFile = WebVTTCaptionFile(_valid_vtt_with_metadata);
       expect(parsedFile.captions.length, 1);
 
-      expect(parsedFile.captions[0].start, Duration(seconds: 1));
-      expect(
-          parsedFile.captions[0].end, Duration(seconds: 2, milliseconds: 500));
+      expect(parsedFile.captions[0].start, const Duration(seconds: 1));
+      expect(parsedFile.captions[0].end,
+          const Duration(seconds: 2, milliseconds: 500));
       expect(parsedFile.captions[0].text, 'We are in New York City');
     });
 
@@ -25,11 +25,11 @@
       expect(parsedFile.captions.length, 1);
 
       expect(parsedFile.captions[0].start,
-          Duration(seconds: 2, milliseconds: 800));
-      expect(
-          parsedFile.captions[0].end, Duration(seconds: 3, milliseconds: 283));
+          const Duration(seconds: 2, milliseconds: 800));
+      expect(parsedFile.captions[0].end,
+          const Duration(seconds: 3, milliseconds: 283));
       expect(parsedFile.captions[0].text,
-          "— It will perforate your stomach.\n— You could die.");
+          '— It will perforate your stomach.\n— You could die.');
     });
 
     test('with styles tags', () {
@@ -37,9 +37,9 @@
       expect(parsedFile.captions.length, 3);
 
       expect(parsedFile.captions[0].start,
-          Duration(seconds: 5, milliseconds: 200));
-      expect(
-          parsedFile.captions[0].end, Duration(seconds: 6, milliseconds: 000));
+          const Duration(seconds: 5, milliseconds: 200));
+      expect(parsedFile.captions[0].end,
+          const Duration(seconds: 6, milliseconds: 000));
       expect(parsedFile.captions[0].text,
           "You know I'm so excited my glasses are falling off here.");
     });
@@ -49,9 +49,9 @@
       expect(parsedFile.captions.length, 3);
 
       expect(parsedFile.captions[0].number, 1);
-      expect(parsedFile.captions.last.start, Duration(seconds: 4));
-      expect(parsedFile.captions.last.end, Duration(seconds: 5));
-      expect(parsedFile.captions.last.text, "Transcrit par Célestes™");
+      expect(parsedFile.captions.last.start, const Duration(seconds: 4));
+      expect(parsedFile.captions.last.end, const Duration(seconds: 5));
+      expect(parsedFile.captions.last.text, 'Transcrit par Célestes™');
     });
 
     test('with [hours]:[minutes]:[seconds].[milliseconds].', () {
@@ -59,9 +59,9 @@
       expect(parsedFile.captions.length, 1);
 
       expect(parsedFile.captions[0].number, 1);
-      expect(parsedFile.captions.last.start, Duration(seconds: 1));
-      expect(parsedFile.captions.last.end, Duration(seconds: 2));
-      expect(parsedFile.captions.last.text, "This is a test.");
+      expect(parsedFile.captions.last.start, const Duration(seconds: 1));
+      expect(parsedFile.captions.last.end, const Duration(seconds: 2));
+      expect(parsedFile.captions.last.text, 'This is a test.');
     });
 
     test('with [minutes]:[seconds].[milliseconds].', () {
@@ -69,9 +69,9 @@
       expect(parsedFile.captions.length, 1);
 
       expect(parsedFile.captions[0].number, 1);
-      expect(parsedFile.captions.last.start, Duration(seconds: 3));
-      expect(parsedFile.captions.last.end, Duration(seconds: 4));
-      expect(parsedFile.captions.last.text, "This is a test.");
+      expect(parsedFile.captions.last.start, const Duration(seconds: 3));
+      expect(parsedFile.captions.last.end, const Duration(seconds: 4));
+      expect(parsedFile.captions.last.text, 'This is a test.');
     });
 
     test('with invalid seconds format returns empty captions.', () {
@@ -105,8 +105,8 @@
 
     final Caption firstCaption = parsedFile.captions.single;
     expect(firstCaption.number, 1);
-    expect(firstCaption.start, Duration(seconds: 13));
-    expect(firstCaption.end, Duration(seconds: 16, milliseconds: 0));
+    expect(firstCaption.start, const Duration(seconds: 13));
+    expect(firstCaption.end, const Duration(seconds: 16, milliseconds: 0));
     expect(firstCaption.text, 'Valid');
   });
 }
diff --git a/script/configs/custom_analysis.yaml b/script/configs/custom_analysis.yaml
index d10424e..71f6f03 100644
--- a/script/configs/custom_analysis.yaml
+++ b/script/configs/custom_analysis.yaml
@@ -17,4 +17,3 @@
 - in_app_purchase/in_app_purchase
 - in_app_purchase/in_app_purchase_android
 - in_app_purchase/in_app_purchase_storekit
-- video_player/video_player