Flutter_dismissible_page icon indicating copy to clipboard operation
Flutter_dismissible_page copied to clipboard

`BouncingScrollPhysics` mode does not work if you wrap the page in `DismissiblePage`

Open PackRuble opened this issue 1 year ago • 0 comments

Describe the bug The problem is that the BouncingScrollPhysics mode refuses to work if your page is wrapped in DismissiblePage. This may be important, but my usage looks like this:

return MyDismissiblePage(
          hitTestBehavior: HitTestBehavior.opaque,
          backgroundColor: Colors.black,
          minRadius: 0.0,
          maxRadius: 24.0,
          dragSensitivity: 0.6,
          startingOpacity: 0.5,
          onDismissed: () => Navigator.of(context).pop(),
          direction: DismissiblePageDismissDirection.startToEnd,
          dismissThresholds: const {
            DismissiblePageDismissDirection.startToEnd: 0.4,
          },
          reverseDuration: const Duration(milliseconds: 100),
          maxTransformValue: 0.5,
          child: child,
        );

DismissiblePage version: problems on 1.0.2 and 1.0.3 from git

Additional context The solution looks quite simple, because the problem is a line inside the build method in DismissiblePage:

return ScrollConfiguration(
        behavior: const _DismissiblePageScrollBehavior(),
        child: MultiAxisDismissiblePage(

If you remove ScrollConfiguration wrapper then scrolling will work great, as expected. I wrote mini code to make everything work as expected. Add the necessary show to export for your case:

import 'package:dismissible_page/dismissible_page.dart'
    show
        DismissiblePage,
        DismissiblePageDismissDirection,
        // ignore: invalid_use_of_visible_for_testing_member
        MultiAxisDismissiblePage,
        // ignore: invalid_use_of_visible_for_testing_member
        SingleAxisDismissiblePage;
import 'package:flutter/gestures.dart' show DragStartBehavior;
import 'package:flutter/material.dart';

export 'package:dismissible_page/dismissible_page.dart'
    show DismissiblePageDismissDirection, TransparentRoute;

class MyDismissiblePage extends DismissiblePage {
  const MyDismissiblePage({
    required super.child,
    required super.onDismissed,
    super.onDragStart,
    super.onDragEnd,
    super.onDragUpdate,
    super.isFullScreen = true,
    super.disabled = false,
    super.backgroundColor = Colors.black,
    super.direction = DismissiblePageDismissDirection.horizontal,
    super.dismissThresholds = const <DismissiblePageDismissDirection, double>{},
    super.dragStartBehavior = DragStartBehavior.down,
    super.dragSensitivity = 0.7,
    super.minRadius = 7,
    super.minScale = .85,
    super.maxRadius = 30,
    super.maxTransformValue = .4,
    super.startingOpacity = 1,
    super.hitTestBehavior = HitTestBehavior.opaque,
    super.reverseDuration = const Duration(milliseconds: 200),
    Key? key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final contentPadding =
        isFullScreen ? EdgeInsets.zero : MediaQuery.of(context).padding;

    if (disabled) {
      return DecoratedBox(
        decoration: BoxDecoration(color: backgroundColor),
        child: Padding(
          padding: contentPadding,
          child: ClipRRect(
            borderRadius: BorderRadius.circular(minRadius),
            child: child,
          ),
        ),
      );
    }

    if (direction == DismissiblePageDismissDirection.multi) {
      return MultiAxisDismissiblePage(
        onDismissed: onDismissed,
        isFullScreen: isFullScreen,
        backgroundColor: backgroundColor,
        direction: direction,
        dismissThresholds: dismissThresholds,
        dragStartBehavior: dragStartBehavior,
        dragSensitivity: dragSensitivity,
        minRadius: minRadius,
        minScale: minScale,
        maxRadius: maxRadius,
        maxTransformValue: maxTransformValue,
        startingOpacity: startingOpacity,
        onDragStart: onDragStart,
        onDragEnd: onDragEnd,
        onDragUpdate: onDragUpdate,
        reverseDuration: reverseDuration,
        hitTestBehavior: hitTestBehavior,
        contentPadding: contentPadding,
        child: child,
      );
    } else {
      return SingleAxisDismissiblePage(
        onDismissed: onDismissed,
        isFullScreen: isFullScreen,
        backgroundColor: backgroundColor,
        direction: direction,
        dismissThresholds: dismissThresholds,
        dragStartBehavior: dragStartBehavior,
        dragSensitivity: dragSensitivity,
        minRadius: minRadius,
        minScale: minScale,
        maxRadius: maxRadius,
        maxTransformValue: maxTransformValue,
        startingOpacity: startingOpacity,
        onDragStart: onDragStart,
        onDragEnd: onDragEnd,
        onDragUpdate: onDragUpdate,
        reverseDuration: reverseDuration,
        hitTestBehavior: hitTestBehavior,
        contentPadding: contentPadding,
        child: child,
      );
    }
  }
}

Thank you very much to the author for the wonderful package!

PackRuble avatar Sep 19 '23 12:09 PackRuble