Clean up dismissable_test to be less fragile (#89870)

This cleans up the dismissable_test to be less fragile, and make it harder to forget to reset things between runs.

I eliminated a bunch of globals that were susceptible to being missed and passed them in to buildTest instead, and removed some values that were always the same (itemExtent).
diff --git a/packages/flutter/test/widgets/dismissible_test.dart b/packages/flutter/test/widgets/dismissible_test.dart
index 523b0d0..438ceeb 100644
--- a/packages/flutter/test/widgets/dismissible_test.dart
+++ b/packages/flutter/test/widgets/dismissible_test.dart
@@ -6,21 +6,20 @@
 import 'package:flutter/widgets.dart';
 import 'package:flutter_test/flutter_test.dart';
 
-const double itemExtent = 100.0;
-const Axis defaultScrollDirection = Axis.vertical;
-Axis scrollDirection = defaultScrollDirection;
 const DismissDirection defaultDismissDirection = DismissDirection.horizontal;
-DismissDirection dismissDirection = defaultDismissDirection;
-late DismissDirection reportedDismissDirection;
-List<int> dismissedItems = <int>[];
-Widget? background;
 const double crossAxisEndOffset = 0.5;
 
+DismissDirection reportedDismissDirection = DismissDirection.horizontal;
+List<int> dismissedItems = <int>[];
+
 Widget buildTest({
+  Axis scrollDirection = Axis.vertical,
+  DismissDirection dismissDirection = defaultDismissDirection,
   double? startToEndThreshold,
   TextDirection textDirection = TextDirection.ltr,
   Future<bool?> Function(BuildContext context, DismissDirection direction)? confirmDismiss,
   ScrollController? controller,
+  Widget? background,
 }) {
   return Directionality(
     textDirection: textDirection,
@@ -50,8 +49,8 @@
                 : <DismissDirection, double>{DismissDirection.startToEnd: startToEndThreshold},
             crossAxisEndOffset: crossAxisEndOffset,
             child: SizedBox(
-              width: itemExtent,
-              height: itemExtent,
+              width: 100.0,
+              height: 100.0,
               child: Text(item.toString()),
             ),
           );
@@ -63,7 +62,7 @@
             controller: controller,
             dragStartBehavior: DragStartBehavior.down,
             scrollDirection: scrollDirection,
-            itemExtent: itemExtent,
+            itemExtent: 100.0,
             children: <int>[0, 1, 2, 3, 4, 5, 6, 7, 8]
               .where((int i) => !dismissedItems.contains(i))
               .map<Widget>(buildDismissibleItem).toList(),
@@ -226,22 +225,18 @@
 
 void main() {
   setUp(() {
+    // Reset "results" variables.
+    reportedDismissDirection = defaultDismissDirection;
     dismissedItems = <int>[];
-    background = null;
-  });
-
-  tearDown(() {
-    // Restore the default values of dismissDirection and scrollDirection
-    // in order to ensure consistency when the test order is randomized.
-    dismissDirection = defaultDismissDirection;
-    scrollDirection = defaultScrollDirection;
   });
 
   testWidgets('Horizontal drag triggers dismiss scrollDirection=vertical', (WidgetTester tester) async {
-    scrollDirection = Axis.vertical;
-    dismissDirection = DismissDirection.horizontal;
-
-    await tester.pumpWidget(buildTest());
+    await tester.pumpWidget(
+      buildTest(
+        scrollDirection: Axis.vertical,
+        dismissDirection: DismissDirection.horizontal,
+      ),
+    );
     expect(dismissedItems, isEmpty);
 
     await dismissItem(tester, 0, gestureDirection: AxisDirection.right);
@@ -256,10 +251,12 @@
   });
 
   testWidgets('Horizontal fling triggers dismiss scrollDirection=vertical', (WidgetTester tester) async {
-    scrollDirection = Axis.vertical;
-    dismissDirection = DismissDirection.horizontal;
-
-    await tester.pumpWidget(buildTest());
+    await tester.pumpWidget(
+      buildTest(
+        scrollDirection: Axis.vertical,
+        dismissDirection: DismissDirection.horizontal,
+      ),
+    );
     expect(dismissedItems, isEmpty);
 
     await dismissItem(tester, 0, gestureDirection: AxisDirection.right, mechanism: flingElement);
@@ -274,10 +271,13 @@
   });
 
   testWidgets('Horizontal fling does not trigger at zero offset, but does otherwise', (WidgetTester tester) async {
-    scrollDirection = Axis.vertical;
-    dismissDirection = DismissDirection.horizontal;
-
-    await tester.pumpWidget(buildTest(startToEndThreshold: 0.95));
+    await tester.pumpWidget(
+      buildTest(
+        startToEndThreshold: 0.95,
+        scrollDirection: Axis.vertical,
+        dismissDirection: DismissDirection.horizontal,
+      ),
+    );
     expect(dismissedItems, isEmpty);
 
     await dismissItem(tester, 0, gestureDirection: AxisDirection.right, mechanism: flingElementFromZero);
@@ -300,10 +300,12 @@
   });
 
   testWidgets('Vertical drag triggers dismiss scrollDirection=horizontal', (WidgetTester tester) async {
-    scrollDirection = Axis.horizontal;
-    dismissDirection = DismissDirection.vertical;
-
-    await tester.pumpWidget(buildTest());
+    await tester.pumpWidget(
+      buildTest(
+        scrollDirection: Axis.horizontal,
+        dismissDirection: DismissDirection.vertical,
+      ),
+    );
     expect(dismissedItems, isEmpty);
 
     await dismissItem(tester, 0, gestureDirection: AxisDirection.up);
@@ -318,10 +320,12 @@
   });
 
   testWidgets('drag-left with DismissDirection.endToStart triggers dismiss (LTR)', (WidgetTester tester) async {
-    scrollDirection = Axis.vertical;
-    dismissDirection = DismissDirection.endToStart;
-
-    await tester.pumpWidget(buildTest());
+    await tester.pumpWidget(
+      buildTest(
+        scrollDirection: Axis.vertical,
+        dismissDirection: DismissDirection.endToStart,
+      ),
+    );
     expect(dismissedItems, isEmpty);
 
     await dismissItem(tester, 0, gestureDirection: AxisDirection.right);
@@ -336,10 +340,12 @@
   });
 
   testWidgets('drag-right with DismissDirection.startToEnd triggers dismiss (LTR)', (WidgetTester tester) async {
-    scrollDirection = Axis.vertical;
-    dismissDirection = DismissDirection.startToEnd;
-
-    await tester.pumpWidget(buildTest());
+    await tester.pumpWidget(
+      buildTest(
+        scrollDirection: Axis.vertical,
+        dismissDirection: DismissDirection.startToEnd,
+      ),
+    );
     expect(dismissedItems, isEmpty);
 
     await dismissItem(tester, 0, gestureDirection: AxisDirection.left);
@@ -352,10 +358,14 @@
   });
 
   testWidgets('drag-right with DismissDirection.endToStart triggers dismiss (RTL)', (WidgetTester tester) async {
-    scrollDirection = Axis.vertical;
-    dismissDirection = DismissDirection.endToStart;
+    await tester.pumpWidget(
+      buildTest(
+        textDirection: TextDirection.rtl,
+        scrollDirection: Axis.vertical,
+        dismissDirection: DismissDirection.endToStart,
+      ),
+    );
 
-    await tester.pumpWidget(buildTest(textDirection: TextDirection.rtl));
     expect(dismissedItems, isEmpty);
 
     await dismissItem(tester, 0, gestureDirection: AxisDirection.left);
@@ -368,10 +378,13 @@
   });
 
   testWidgets('drag-left with DismissDirection.startToEnd triggers dismiss (RTL)', (WidgetTester tester) async {
-    scrollDirection = Axis.vertical;
-    dismissDirection = DismissDirection.startToEnd;
-
-    await tester.pumpWidget(buildTest(textDirection: TextDirection.rtl));
+    await tester.pumpWidget(
+      buildTest(
+        textDirection: TextDirection.rtl,
+        scrollDirection: Axis.vertical,
+        dismissDirection: DismissDirection.startToEnd,
+      ),
+    );
     expect(dismissedItems, isEmpty);
 
     await dismissItem(tester, 0, gestureDirection: AxisDirection.right);
@@ -386,10 +399,12 @@
   });
 
   testWidgets('fling-left with DismissDirection.endToStart triggers dismiss (LTR)', (WidgetTester tester) async {
-    scrollDirection = Axis.vertical;
-    dismissDirection = DismissDirection.endToStart;
-
-    await tester.pumpWidget(buildTest());
+    await tester.pumpWidget(
+      buildTest(
+        scrollDirection: Axis.vertical,
+        dismissDirection: DismissDirection.endToStart,
+      ),
+    );
     expect(dismissedItems, isEmpty);
 
     await dismissItem(tester, 0, gestureDirection: AxisDirection.right);
@@ -404,10 +419,13 @@
   });
 
   testWidgets('fling-right with DismissDirection.startToEnd triggers dismiss (LTR)', (WidgetTester tester) async {
-    scrollDirection = Axis.vertical;
-    dismissDirection = DismissDirection.startToEnd;
+    await tester.pumpWidget(
+      buildTest(
+        scrollDirection: Axis.vertical,
+        dismissDirection: DismissDirection.startToEnd,
+      ),
+    );
 
-    await tester.pumpWidget(buildTest());
     expect(dismissedItems, isEmpty);
 
     await dismissItem(tester, 0, mechanism: flingElement, gestureDirection: AxisDirection.left);
@@ -420,10 +438,13 @@
   });
 
   testWidgets('fling-right with DismissDirection.endToStart triggers dismiss (RTL)', (WidgetTester tester) async {
-    scrollDirection = Axis.vertical;
-    dismissDirection = DismissDirection.endToStart;
-
-    await tester.pumpWidget(buildTest(textDirection: TextDirection.rtl));
+    await tester.pumpWidget(
+      buildTest(
+        textDirection: TextDirection.rtl,
+        scrollDirection: Axis.vertical,
+        dismissDirection: DismissDirection.endToStart,
+      ),
+    );
     expect(dismissedItems, isEmpty);
 
     await dismissItem(tester, 0, mechanism: flingElement, gestureDirection: AxisDirection.left);
@@ -436,10 +457,13 @@
   });
 
   testWidgets('fling-left with DismissDirection.startToEnd triggers dismiss (RTL)', (WidgetTester tester) async {
-    scrollDirection = Axis.vertical;
-    dismissDirection = DismissDirection.startToEnd;
-
-    await tester.pumpWidget(buildTest(textDirection: TextDirection.rtl));
+    await tester.pumpWidget(
+      buildTest(
+        textDirection: TextDirection.rtl,
+        scrollDirection: Axis.vertical,
+        dismissDirection: DismissDirection.startToEnd,
+      ),
+    );
     expect(dismissedItems, isEmpty);
 
     await dismissItem(tester, 0, mechanism: flingElement, gestureDirection: AxisDirection.right);
@@ -454,10 +478,12 @@
   });
 
   testWidgets('drag-up with DismissDirection.up triggers dismiss', (WidgetTester tester) async {
-    scrollDirection = Axis.horizontal;
-    dismissDirection = DismissDirection.up;
-
-    await tester.pumpWidget(buildTest());
+    await tester.pumpWidget(
+      buildTest(
+        scrollDirection: Axis.horizontal,
+        dismissDirection: DismissDirection.up,
+      ),
+    );
     expect(dismissedItems, isEmpty);
 
     await dismissItem(tester, 0, gestureDirection: AxisDirection.down);
@@ -470,10 +496,12 @@
   });
 
   testWidgets('drag-down with DismissDirection.down triggers dismiss', (WidgetTester tester) async {
-    scrollDirection = Axis.horizontal;
-    dismissDirection = DismissDirection.down;
-
-    await tester.pumpWidget(buildTest());
+    await tester.pumpWidget(
+      buildTest(
+        scrollDirection: Axis.horizontal,
+        dismissDirection: DismissDirection.down,
+      ),
+    );
     expect(dismissedItems, isEmpty);
 
     await dismissItem(tester, 0, gestureDirection: AxisDirection.up);
@@ -486,10 +514,12 @@
   });
 
   testWidgets('fling-up with DismissDirection.up triggers dismiss', (WidgetTester tester) async {
-    scrollDirection = Axis.horizontal;
-    dismissDirection = DismissDirection.up;
-
-    await tester.pumpWidget(buildTest());
+    await tester.pumpWidget(
+      buildTest(
+        scrollDirection: Axis.horizontal,
+        dismissDirection: DismissDirection.up,
+      ),
+    );
     expect(dismissedItems, isEmpty);
 
     await dismissItem(tester, 0, mechanism: flingElement, gestureDirection: AxisDirection.down);
@@ -502,10 +532,12 @@
   });
 
   testWidgets('fling-down with DismissDirection.down triggers dismiss', (WidgetTester tester) async {
-    scrollDirection = Axis.horizontal;
-    dismissDirection = DismissDirection.down;
-
-    await tester.pumpWidget(buildTest());
+    await tester.pumpWidget(
+      buildTest(
+        scrollDirection: Axis.horizontal,
+        dismissDirection: DismissDirection.down,
+      ),
+    );
     expect(dismissedItems, isEmpty);
 
     await dismissItem(tester, 0, mechanism: flingElement, gestureDirection: AxisDirection.up);
@@ -518,10 +550,13 @@
   });
 
   testWidgets('drag-left has no effect on dismissible with a high dismiss threshold', (WidgetTester tester) async {
-    scrollDirection = Axis.vertical;
-    dismissDirection = DismissDirection.horizontal;
-
-    await tester.pumpWidget(buildTest(startToEndThreshold: 1.0));
+    await tester.pumpWidget(
+      buildTest(
+        startToEndThreshold: 1.0,
+        scrollDirection: Axis.vertical,
+        dismissDirection: DismissDirection.horizontal,
+      ),
+    );
     expect(dismissedItems, isEmpty);
 
     await dismissItem(tester, 0, gestureDirection: AxisDirection.right);
@@ -534,10 +569,13 @@
   });
 
   testWidgets('fling-left has no effect on dismissible with a high dismiss threshold', (WidgetTester tester) async {
-    scrollDirection = Axis.vertical;
-    dismissDirection = DismissDirection.horizontal;
-
-    await tester.pumpWidget(buildTest(startToEndThreshold: 1.0));
+    await tester.pumpWidget(
+      buildTest(
+        startToEndThreshold: 1.0,
+        scrollDirection: Axis.vertical,
+        dismissDirection: DismissDirection.horizontal,
+      ),
+    );
     expect(dismissedItems, isEmpty);
 
     await dismissItem(tester, 0, mechanism: flingElement, gestureDirection: AxisDirection.right);
@@ -556,10 +594,12 @@
   // https://github.com/flutter/engine/pull/1134 at the time, and later made
   // irrelevant by fn3, but just in case...
   testWidgets('Verify that drag-move events do not assert', (WidgetTester tester) async {
-    scrollDirection = Axis.horizontal;
-    dismissDirection = DismissDirection.down;
-
-    await tester.pumpWidget(buildTest());
+    await tester.pumpWidget(
+      buildTest(
+        scrollDirection: Axis.horizontal,
+        dismissDirection: DismissDirection.down,
+      ),
+    );
     final Offset location = tester.getTopLeft(find.text('0'));
     const Offset offset = Offset(0.0, 5.0);
     final TestGesture gesture = await tester.startGesture(location, pointer: 5);
@@ -613,11 +653,13 @@
   });
 
   testWidgets('Dismissible starts from the full size when collapsing', (WidgetTester tester) async {
-    scrollDirection = Axis.vertical;
-    dismissDirection = DismissDirection.horizontal;
-    background = const Text('background');
-
-    await tester.pumpWidget(buildTest());
+    await tester.pumpWidget(
+      buildTest(
+        background: const Text('background'),
+        scrollDirection: Axis.vertical,
+        dismissDirection: DismissDirection.horizontal,
+      ),
+    );
     expect(dismissedItems, isEmpty);
 
     final Finder itemFinder = find.text('0');
@@ -653,8 +695,7 @@
   });
 
   testWidgets('Horizontal fling less than threshold', (WidgetTester tester) async {
-    scrollDirection = Axis.horizontal;
-    await tester.pumpWidget(buildTest());
+    await tester.pumpWidget(buildTest(scrollDirection: Axis.horizontal));
     expect(dismissedItems, isEmpty);
 
     await checkFlingItemAfterMovement(tester, 0, gestureDirection: AxisDirection.left, mechanism: rollbackElement);
@@ -667,8 +708,7 @@
   });
 
   testWidgets('Vertical fling less than threshold', (WidgetTester tester) async {
-    scrollDirection = Axis.vertical;
-    await tester.pumpWidget(buildTest());
+    await tester.pumpWidget(buildTest(scrollDirection: Axis.vertical));
     expect(dismissedItems, isEmpty);
 
     await checkFlingItemAfterMovement(tester, 0, gestureDirection: AxisDirection.left, mechanism: rollbackElement);
@@ -681,13 +721,13 @@
   });
 
   testWidgets('confirmDismiss returns values: true, false, null', (WidgetTester tester) async {
-    scrollDirection = Axis.vertical;
-    dismissDirection = DismissDirection.horizontal;
     late DismissDirection confirmDismissDirection;
 
     Widget buildFrame(bool? confirmDismissValue) {
       return buildTest(
-        confirmDismiss: (BuildContext context, DismissDirection dismissDirection) {
+          scrollDirection: Axis.vertical,
+          dismissDirection: DismissDirection.horizontal,
+          confirmDismiss: (BuildContext context, DismissDirection dismissDirection) {
           confirmDismissDirection = dismissDirection;
           return Future<bool?>.value(confirmDismissValue);
         },
@@ -740,8 +780,8 @@
   });
 
   testWidgets('setState that does not remove the Dismissible from tree should throws Error', (WidgetTester tester) async {
-    scrollDirection = Axis.vertical;
-    dismissDirection = DismissDirection.horizontal;
+    const Axis scrollDirection = Axis.vertical;
+    const DismissDirection dismissDirection = DismissDirection.horizontal;
 
     await tester.pumpWidget(Directionality(
       textDirection: TextDirection.ltr,
@@ -750,7 +790,7 @@
           return ListView(
             dragStartBehavior: DragStartBehavior.down,
             scrollDirection: scrollDirection,
-            itemExtent: itemExtent,
+            itemExtent: 100.0,
             children: <Widget>[
               Dismissible(
                 dragStartBehavior: DragStartBehavior.down,
@@ -763,12 +803,11 @@
                     dismissedItems.add(1);
                   });
                 },
-                background: background,
                 dismissThresholds: const <DismissDirection, double>{},
                 crossAxisEndOffset: crossAxisEndOffset,
                 child: SizedBox(
-                  width: itemExtent,
-                  height: itemExtent,
+                  width: 100.0,
+                  height: 100.0,
                   child: Text(1.toString()),
                 ),
               ),
@@ -873,9 +912,7 @@
   });
 
   testWidgets('DismissDirection.none does not trigger dismiss', (WidgetTester tester) async {
-    dismissDirection = DismissDirection.none;
-
-    await tester.pumpWidget(buildTest());
+    await tester.pumpWidget(buildTest(dismissDirection: DismissDirection.none));
     expect(dismissedItems, isEmpty);
 
     await dismissItem(tester, 0, gestureDirection: AxisDirection.left);
@@ -886,10 +923,14 @@
   });
 
   testWidgets('DismissDirection.none does not prevent scrolling', (WidgetTester tester) async {
-    dismissDirection = DismissDirection.none;
     final ScrollController controller = ScrollController();
 
-    await tester.pumpWidget(buildTest(controller: controller));
+    await tester.pumpWidget(
+      buildTest(
+        controller: controller,
+        dismissDirection: DismissDirection.none,
+      ),
+    );
     expect(dismissedItems, isEmpty);
     expect(controller.offset, 0.0);
 
@@ -901,5 +942,6 @@
     expect(controller.offset, 0.0);
     await dismissItem(tester, 0, gestureDirection: AxisDirection.up);
     expect(controller.offset, 99.9);
+    controller.dispose();
   });
 }