Added 'exclude' parameter to 'testWidgets()'. (#86397)

diff --git a/packages/flutter_test/lib/src/widget_tester.dart b/packages/flutter_test/lib/src/widget_tester.dart
index 9cbec13..9651fda 100644
--- a/packages/flutter_test/lib/src/widget_tester.dart
+++ b/packages/flutter_test/lib/src/widget_tester.dart
@@ -100,6 +100,14 @@
 /// each value of the [TestVariant.values]. If [variant] is not set, the test
 /// will be run once using the base test environment.
 ///
+/// If either [exclude] or [skip] is `true`, then the test will be skipped. The
+/// difference is that [skip] is a temporary way to disable a problematic test
+/// while a fix is being developed. It should have a comment after it with a
+/// link to a tracking issue for the work on re-enabling the test.
+///
+/// [exclude] is used to indicate that the test is not designed to run under
+/// the condition given and should always be skipped when it is `true`.
+///
 /// If the [tags] are passed, they declare user-defined tags that are implemented by
 /// the `test` package.
 ///
@@ -117,11 +125,26 @@
 ///   expect(find.text('Success'), findsOneWidget);
 /// });
 /// ```
+///
+/// ### Excluded test
+/// ```dart
+/// testWidgets('Some test that will never make sense for the web', (WidgetTester tester) async {
+///   // test code
+/// }, exclude: isBrowser);
+/// ```
+///
+/// ### Skipped test
+/// ```dart
+/// testWidgets('Some flaky test', (WidgetTester tester) async {
+///   // test code
+/// }, skip: true); // https://github.com/flutter/flutter/issues/12345
+/// ```
 @isTest
 void testWidgets(
   String description,
   WidgetTesterCallback callback, {
-  bool? skip,
+  bool skip = false,
+  bool exclude = false,
   test_package.Timeout? timeout,
   Duration? initialTimeout,
   bool semanticsEnabled = true,
@@ -169,7 +192,7 @@
           timeout: initialTimeout,
         );
       },
-      skip: skip,
+      skip: (exclude || skip) ? true : null,
       timeout: timeout ?? binding.defaultTestTimeout,
       tags: tags,
     );
diff --git a/packages/flutter_test/test/widget_tester_test.dart b/packages/flutter_test/test/widget_tester_test.dart
index e3ce327..ebdcd61 100644
--- a/packages/flutter_test/test/widget_tester_test.dart
+++ b/packages/flutter_test/test/widget_tester_test.dart
@@ -738,6 +738,16 @@
     });
   });
 
+  group('Skip and exclude work', () {
+    testWidgets('skipping a test skips it', (WidgetTester tester) async {
+      expect(true, false); // shouldn't get here
+    }, skip: true); // https://github.com/someissue
+
+    testWidgets('excluding a test skips it', (WidgetTester tester) async {
+      expect(true, false); // shouldn't get here
+    }, exclude: true);
+  });
+
   group('Pending timer', () {
     late TestExceptionReporter currentExceptionReporter;
     setUp(() {