Make Dismissible's HitTestBehavior an argument (#64379)

diff --git a/packages/flutter/lib/src/widgets/dismissible.dart b/packages/flutter/lib/src/widgets/dismissible.dart
index 3105160..799880c 100644
--- a/packages/flutter/lib/src/widgets/dismissible.dart
+++ b/packages/flutter/lib/src/widgets/dismissible.dart
@@ -94,6 +94,7 @@
     this.movementDuration = const Duration(milliseconds: 200),
     this.crossAxisEndOffset = 0.0,
     this.dragStartBehavior = DragStartBehavior.start,
+    this.behavior = HitTestBehavior.opaque,
   }) : assert(key != null),
        assert(secondaryBackground == null || background != null),
        assert(dragStartBehavior != null),
@@ -185,6 +186,11 @@
   ///  * [DragGestureRecognizer.dragStartBehavior], which gives an example for the different behaviors.
   final DragStartBehavior dragStartBehavior;
 
+  /// How to behave during hit tests.
+  ///
+  /// This defaults to [HitTestBehavior.opaque].
+  final HitTestBehavior behavior;
+
   @override
   _DismissibleState createState() => _DismissibleState();
 }
@@ -574,7 +580,7 @@
       onVerticalDragStart: _directionIsXAxis ? null : _handleDragStart,
       onVerticalDragUpdate: _directionIsXAxis ? null : _handleDragUpdate,
       onVerticalDragEnd: _directionIsXAxis ? null : _handleDragEnd,
-      behavior: HitTestBehavior.opaque,
+      behavior: widget.behavior,
       child: content,
       dragStartBehavior: widget.dragStartBehavior,
     );
diff --git a/packages/flutter/test/widgets/dismissible_test.dart b/packages/flutter/test/widgets/dismissible_test.dart
index 44e102f..20e1c7d 100644
--- a/packages/flutter/test/widgets/dismissible_test.dart
+++ b/packages/flutter/test/widgets/dismissible_test.dart
@@ -798,4 +798,73 @@
       '   handler has fired.\n',
     );
   });
+
+  testWidgets('Dismissible.behavior should behave correctly during hit testing', (WidgetTester tester) async {
+    bool didReceivePointerDown = false;
+
+    Widget buildStack({Widget child}) {
+      return Directionality(
+        textDirection: TextDirection.ltr,
+        child: Stack(
+          children: <Widget>[
+            Listener(
+              onPointerDown: (_) {
+                didReceivePointerDown = true;
+              },
+              child: Container(
+                width: 100.0,
+                height: 100.0,
+                color: const Color(0xFF00FF00),
+              ),
+            ),
+            child,
+          ],
+        ),
+      );
+    }
+
+    await tester.pumpWidget(
+      buildStack(
+        child: const Dismissible(
+          key: ValueKey<int>(1),
+          child: SizedBox(
+            width: 100.0,
+            height: 100.0,
+          ),
+        ),
+      ),
+    );
+    await tester.tapAt(const Offset(10.0, 10.0));
+    expect(didReceivePointerDown, isFalse);
+
+    Future<void> pumpWidgetTree(HitTestBehavior behavior) {
+      return tester.pumpWidget(
+        buildStack(
+          child: Dismissible(
+            key: const ValueKey<int>(1),
+            behavior: behavior,
+            child: const SizedBox(
+              width: 100.0,
+              height: 100.0,
+            ),
+          ),
+        ),
+      );
+    }
+
+    didReceivePointerDown = false;
+    await pumpWidgetTree(HitTestBehavior.deferToChild);
+    await tester.tapAt(const Offset(10.0, 10.0));
+    expect(didReceivePointerDown, isTrue);
+
+    didReceivePointerDown = false;
+    await pumpWidgetTree(HitTestBehavior.opaque);
+    await tester.tapAt(const Offset(10.0, 10.0));
+    expect(didReceivePointerDown, isFalse);
+
+    didReceivePointerDown = false;
+    await pumpWidgetTree(HitTestBehavior.translucent);
+    await tester.tapAt(const Offset(10.0, 10.0));
+    expect(didReceivePointerDown, isTrue);
+  });
 }