[various] Replaces manual hashing with Object.hash (#5314)

diff --git a/packages/camera/camera_platform_interface/CHANGELOG.md b/packages/camera/camera_platform_interface/CHANGELOG.md
index 6ed662b..ef251ea 100644
--- a/packages/camera/camera_platform_interface/CHANGELOG.md
+++ b/packages/camera/camera_platform_interface/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 2.1.6
+
+* Adopts `Object.hash`.
+* Removes obsolete dependency on `pedantic`.
+
 ## 2.1.5
 
 * Fixes asynchronous exceptions handling of the `initializeCamera` method.
diff --git a/packages/camera/camera_platform_interface/lib/src/events/camera_event.dart b/packages/camera/camera_platform_interface/lib/src/events/camera_event.dart
index a91e538..755006c 100644
--- a/packages/camera/camera_platform_interface/lib/src/events/camera_event.dart
+++ b/packages/camera/camera_platform_interface/lib/src/events/camera_event.dart
@@ -117,14 +117,15 @@
           focusPointSupported == other.focusPointSupported;
 
   @override
-  int get hashCode =>
-      super.hashCode ^
-      previewWidth.hashCode ^
-      previewHeight.hashCode ^
-      exposureMode.hashCode ^
-      exposurePointSupported.hashCode ^
-      focusMode.hashCode ^
-      focusPointSupported.hashCode;
+  int get hashCode => Object.hash(
+        super.hashCode,
+        previewWidth,
+        previewHeight,
+        exposureMode,
+        exposurePointSupported,
+        focusMode,
+        focusPointSupported,
+      );
 }
 
 /// An event fired when the resolution preset of the camera has changed.
@@ -171,8 +172,7 @@
           captureHeight == other.captureHeight;
 
   @override
-  int get hashCode =>
-      super.hashCode ^ captureWidth.hashCode ^ captureHeight.hashCode;
+  int get hashCode => Object.hash(super.hashCode, captureWidth, captureHeight);
 }
 
 /// An event fired when the camera is going to close.
@@ -239,7 +239,7 @@
           description == other.description;
 
   @override
-  int get hashCode => super.hashCode ^ description.hashCode;
+  int get hashCode => Object.hash(super.hashCode, description);
 }
 
 /// An event fired when a video has finished recording.
@@ -284,6 +284,5 @@
           maxVideoDuration == other.maxVideoDuration;
 
   @override
-  int get hashCode =>
-      super.hashCode ^ file.hashCode ^ maxVideoDuration.hashCode;
+  int get hashCode => Object.hash(super.hashCode, file, maxVideoDuration);
 }
diff --git a/packages/camera/camera_platform_interface/lib/src/types/camera_description.dart b/packages/camera/camera_platform_interface/lib/src/types/camera_description.dart
index df72636..0167cf9 100644
--- a/packages/camera/camera_platform_interface/lib/src/types/camera_description.dart
+++ b/packages/camera/camera_platform_interface/lib/src/types/camera_description.dart
@@ -50,7 +50,7 @@
           lensDirection == other.lensDirection;
 
   @override
-  int get hashCode => name.hashCode ^ lensDirection.hashCode;
+  int get hashCode => Object.hash(name, lensDirection);
 
   @override
   String toString() {
diff --git a/packages/camera/camera_platform_interface/pubspec.yaml b/packages/camera/camera_platform_interface/pubspec.yaml
index b28008d..ab163b4 100644
--- a/packages/camera/camera_platform_interface/pubspec.yaml
+++ b/packages/camera/camera_platform_interface/pubspec.yaml
@@ -4,11 +4,11 @@
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22
 # NOTE: We strongly prefer non-breaking changes, even at the expense of a
 # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes
-version: 2.1.5
+version: 2.1.6
 
 environment:
   sdk: '>=2.12.0 <3.0.0'
-  flutter: ">=2.0.0"
+  flutter: ">=2.8.0"
 
 dependencies:
   cross_file: ^0.3.1
@@ -21,4 +21,3 @@
   async: ^2.5.0
   flutter_test:
     sdk: flutter
-  pedantic: ^1.10.0
diff --git a/packages/camera/camera_platform_interface/test/events/camera_event_test.dart b/packages/camera/camera_platform_interface/test/events/camera_event_test.dart
index a46486e..8a428e2 100644
--- a/packages/camera/camera_platform_interface/test/events/camera_event_test.dart
+++ b/packages/camera/camera_platform_interface/test/events/camera_event_test.dart
@@ -137,13 +137,14 @@
     test('hashCode should match hashCode of all properties', () {
       const CameraInitializedEvent event = CameraInitializedEvent(
           1, 1024, 640, ExposureMode.auto, true, FocusMode.auto, true);
-      final int expectedHashCode = event.cameraId.hashCode ^
-          event.previewWidth.hashCode ^
-          event.previewHeight.hashCode ^
-          event.exposureMode.hashCode ^
-          event.exposurePointSupported.hashCode ^
-          event.focusMode.hashCode ^
-          event.focusPointSupported.hashCode;
+      final int expectedHashCode = Object.hash(
+          event.cameraId,
+          event.previewWidth,
+          event.previewHeight,
+          event.exposureMode,
+          event.exposurePointSupported,
+          event.focusMode,
+          event.focusPointSupported);
 
       expect(event.hashCode, expectedHashCode);
     });
@@ -223,9 +224,8 @@
     test('hashCode should match hashCode of all properties', () {
       const CameraResolutionChangedEvent event =
           CameraResolutionChangedEvent(1, 1024, 640);
-      final int expectedHashCode = event.cameraId.hashCode ^
-          event.captureWidth.hashCode ^
-          event.captureHeight.hashCode;
+      final int expectedHashCode =
+          Object.hash(event.cameraId, event.captureWidth, event.captureHeight);
 
       expect(event.hashCode, expectedHashCode);
     });
@@ -328,7 +328,7 @@
     test('hashCode should match hashCode of all properties', () {
       const CameraErrorEvent event = CameraErrorEvent(1, 'Error');
       final int expectedHashCode =
-          event.cameraId.hashCode ^ event.description.hashCode;
+          Object.hash(event.cameraId, event.description);
 
       expect(event.hashCode, expectedHashCode);
     });
diff --git a/packages/camera/camera_platform_interface/test/types/camera_description_test.dart b/packages/camera/camera_platform_interface/test/types/camera_description_test.dart
index 3d3aaae..a86df03 100644
--- a/packages/camera/camera_platform_interface/test/types/camera_description_test.dart
+++ b/packages/camera/camera_platform_interface/test/types/camera_description_test.dart
@@ -97,15 +97,15 @@
       expect(firstDescription == secondDescription, true);
     });
 
-    test('hashCode should match hashCode of all properties', () {
+    test('hashCode should match hashCode of all equality-tested properties',
+        () {
       const CameraDescription description = CameraDescription(
         name: 'Test',
         lensDirection: CameraLensDirection.front,
         sensorOrientation: 0,
       );
-      final int expectedHashCode = description.name.hashCode ^
-          description.lensDirection.hashCode ^
-          description.sensorOrientation.hashCode;
+      final int expectedHashCode =
+          Object.hash(description.name, description.lensDirection);
 
       expect(description.hashCode, expectedHashCode);
     });
diff --git a/packages/local_auth/local_auth_android/CHANGELOG.md b/packages/local_auth/local_auth_android/CHANGELOG.md
index 7f198f2..121daf9 100644
--- a/packages/local_auth/local_auth_android/CHANGELOG.md
+++ b/packages/local_auth/local_auth_android/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.0.1
+
+* Adopts `Object.hash`.
+
 ## 1.0.0
 
-* Initial release from migration to federated architecture. 
+* Initial release from migration to federated architecture.
diff --git a/packages/local_auth/local_auth_android/lib/types/auth_messages_android.dart b/packages/local_auth/local_auth_android/lib/types/auth_messages_android.dart
index ea61a4b..ad90124 100644
--- a/packages/local_auth/local_auth_android/lib/types/auth_messages_android.dart
+++ b/packages/local_auth/local_auth_android/lib/types/auth_messages_android.dart
@@ -110,17 +110,18 @@
           signInTitle == other.signInTitle;
 
   @override
-  int get hashCode =>
-      biometricHint.hashCode ^
-      biometricNotRecognized.hashCode ^
-      biometricRequiredTitle.hashCode ^
-      biometricSuccess.hashCode ^
-      cancelButton.hashCode ^
-      deviceCredentialsRequiredTitle.hashCode ^
-      deviceCredentialsSetupDescription.hashCode ^
-      goToSettingsButton.hashCode ^
-      goToSettingsDescription.hashCode ^
-      signInTitle.hashCode;
+  int get hashCode => Object.hash(
+      super.hashCode,
+      biometricHint,
+      biometricNotRecognized,
+      biometricRequiredTitle,
+      biometricSuccess,
+      cancelButton,
+      deviceCredentialsRequiredTitle,
+      deviceCredentialsSetupDescription,
+      goToSettingsButton,
+      goToSettingsDescription,
+      signInTitle);
 }
 
 // Default strings for AndroidAuthMessages. Currently supports English.
diff --git a/packages/local_auth/local_auth_android/pubspec.yaml b/packages/local_auth/local_auth_android/pubspec.yaml
index ec2991d..5734843 100644
--- a/packages/local_auth/local_auth_android/pubspec.yaml
+++ b/packages/local_auth/local_auth_android/pubspec.yaml
@@ -2,7 +2,7 @@
 description: Android implementation of the local_auth plugin.
 repository: https://github.com/flutter/plugins/tree/master/packages/local_auth/local_auth_android
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+local_auth%22
-version: 1.0.0
+version: 1.0.1
 
 environment:
   sdk: ">=2.14.0 <3.0.0"
@@ -26,4 +26,4 @@
 
 dev_dependencies:
   flutter_test:
-    sdk: flutter
\ No newline at end of file
+    sdk: flutter
diff --git a/packages/local_auth/local_auth_ios/CHANGELOG.md b/packages/local_auth/local_auth_ios/CHANGELOG.md
index ccacae9..466aeb5 100644
--- a/packages/local_auth/local_auth_ios/CHANGELOG.md
+++ b/packages/local_auth/local_auth_ios/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.0.3
+
+* Adopts `Object.hash`.
+
 ## 1.0.2
 
 * Adds support `localizedFallbackTitle` in authenticateWithBiometrics on iOS.
@@ -8,4 +12,4 @@
 
 ## 1.0.0
 
-* Initial release from migration to federated architecture. 
+* Initial release from migration to federated architecture.
diff --git a/packages/local_auth/local_auth_ios/lib/types/auth_messages_ios.dart b/packages/local_auth/local_auth_ios/lib/types/auth_messages_ios.dart
index b3236a7..e5173fc 100644
--- a/packages/local_auth/local_auth_ios/lib/types/auth_messages_ios.dart
+++ b/packages/local_auth/local_auth_ios/lib/types/auth_messages_ios.dart
@@ -65,12 +65,14 @@
           localizedFallbackTitle == other.localizedFallbackTitle;
 
   @override
-  int get hashCode =>
-      lockOut.hashCode ^
-      goToSettingsButton.hashCode ^
-      goToSettingsDescription.hashCode ^
-      cancelButton.hashCode ^
-      localizedFallbackTitle.hashCode;
+  int get hashCode => Object.hash(
+        super.hashCode,
+        lockOut,
+        goToSettingsButton,
+        goToSettingsDescription,
+        cancelButton,
+        localizedFallbackTitle,
+      );
 }
 
 // Default Strings for IOSAuthMessages plugin. Currently supports English.
diff --git a/packages/local_auth/local_auth_ios/pubspec.yaml b/packages/local_auth/local_auth_ios/pubspec.yaml
index 9e69dc7..06d972a 100644
--- a/packages/local_auth/local_auth_ios/pubspec.yaml
+++ b/packages/local_auth/local_auth_ios/pubspec.yaml
@@ -2,7 +2,7 @@
 description: iOS implementation of the local_auth plugin.
 repository: https://github.com/flutter/plugins/tree/master/packages/local_auth/local_auth_ios
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+local_auth%22
-version: 1.0.2
+version: 1.0.3
 
 environment:
   sdk: ">=2.14.0 <3.0.0"
@@ -24,4 +24,4 @@
 
 dev_dependencies:
   flutter_test:
-    sdk: flutter
\ No newline at end of file
+    sdk: flutter
diff --git a/packages/local_auth/local_auth_platform_interface/CHANGELOG.md b/packages/local_auth/local_auth_platform_interface/CHANGELOG.md
index d16a91e..0ff4d16 100644
--- a/packages/local_auth/local_auth_platform_interface/CHANGELOG.md
+++ b/packages/local_auth/local_auth_platform_interface/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.0.2
+
+* Adopts `Object.hash`.
+
 ## 1.0.1
 
 * Export externally used types from local_auth_platform_interface.dart directly.
diff --git a/packages/local_auth/local_auth_platform_interface/lib/types/auth_options.dart b/packages/local_auth/local_auth_platform_interface/lib/types/auth_options.dart
index c4b646c..a5af8e7 100644
--- a/packages/local_auth/local_auth_platform_interface/lib/types/auth_options.dart
+++ b/packages/local_auth/local_auth_platform_interface/lib/types/auth_options.dart
@@ -52,9 +52,10 @@
           biometricOnly == other.biometricOnly;
 
   @override
-  int get hashCode =>
-      useErrorDialogs.hashCode ^
-      stickyAuth.hashCode ^
-      sensitiveTransaction.hashCode ^
-      biometricOnly.hashCode;
+  int get hashCode => Object.hash(
+        useErrorDialogs,
+        stickyAuth,
+        sensitiveTransaction,
+        biometricOnly,
+      );
 }
diff --git a/packages/local_auth/local_auth_platform_interface/pubspec.yaml b/packages/local_auth/local_auth_platform_interface/pubspec.yaml
index cd12a8a..b5d476d 100644
--- a/packages/local_auth/local_auth_platform_interface/pubspec.yaml
+++ b/packages/local_auth/local_auth_platform_interface/pubspec.yaml
@@ -4,7 +4,7 @@
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+local_auth%22
 # NOTE: We strongly prefer non-breaking changes, even at the expense of a
 # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes
-version: 1.0.1
+version: 1.0.2
 
 environment:
   sdk: ">=2.14.0 <3.0.0"
@@ -19,4 +19,4 @@
 dev_dependencies:
   flutter_test:
     sdk: flutter
-  mockito: ^5.0.0
\ No newline at end of file
+  mockito: ^5.0.0
diff --git a/packages/video_player/video_player_platform_interface/CHANGELOG.md b/packages/video_player/video_player_platform_interface/CHANGELOG.md
index 6595a5c..9843fd8 100644
--- a/packages/video_player/video_player_platform_interface/CHANGELOG.md
+++ b/packages/video_player/video_player_platform_interface/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 5.1.2
+
+* Adopts `Object.hash`.
+* Removes obsolete dependency on `pedantic`.
+
 ## 5.1.1
 
 * Adds `rotationCorrection` (for Android playing videos recorded in landscapeRight [#60327](https://github.com/flutter/flutter/issues/60327)).
diff --git a/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart b/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart
index 706ec61..78173f1 100644
--- a/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart
+++ b/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart
@@ -249,12 +249,13 @@
   }
 
   @override
-  int get hashCode =>
-      eventType.hashCode ^
-      duration.hashCode ^
-      size.hashCode ^
-      rotationCorrection.hashCode ^
-      buffered.hashCode;
+  int get hashCode => Object.hash(
+        eventType,
+        duration,
+        size,
+        rotationCorrection,
+        buffered,
+      );
 }
 
 /// Type of the event.
@@ -343,7 +344,7 @@
           end == other.end;
 
   @override
-  int get hashCode => start.hashCode ^ end.hashCode;
+  int get hashCode => Object.hash(start, end);
 }
 
 /// [VideoPlayerOptions] can be optionally used to set additional player settings
diff --git a/packages/video_player/video_player_platform_interface/pubspec.yaml b/packages/video_player/video_player_platform_interface/pubspec.yaml
index ea3b17b..7a18568 100644
--- a/packages/video_player/video_player_platform_interface/pubspec.yaml
+++ b/packages/video_player/video_player_platform_interface/pubspec.yaml
@@ -4,11 +4,11 @@
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+video_player%22
 # NOTE: We strongly prefer non-breaking changes, even at the expense of a
 # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes
-version: 5.1.1
+version: 5.1.2
 
 environment:
   sdk: ">=2.12.0 <3.0.0"
-  flutter: ">=2.0.0"
+  flutter: ">=2.8.0"
 
 dependencies:
   flutter:
@@ -18,5 +18,4 @@
 dev_dependencies:
   flutter_test:
     sdk: flutter
-  pedantic: ^1.10.0
   pigeon: 0.1.21
diff --git a/script/tool/test/util.dart b/script/tool/test/util.dart
index 6f7d86e..fab4f39 100644
--- a/script/tool/test/util.dart
+++ b/script/tool/test/util.dart
@@ -434,8 +434,7 @@
   }
 
   @override
-  int get hashCode =>
-      (executable.hashCode) ^ (args.hashCode) ^ (workingDir?.hashCode ?? 0);
+  int get hashCode => Object.hash(executable, args, workingDir);
 
   @override
   String toString() {