Transparent PageRoute in Flutter for displaying a (semi-) transparent page

后端 未结 3 882
余生分开走
余生分开走 2021-01-01 11:22

Would it be possible to have a page route with a transparent background so I can show a (semi-)transparent page on top of an existing page?

3条回答
  •  被撕碎了的回忆
    2021-01-01 11:32

    Yes, definitely! One solution would be to extend PageRoute and make the opaque getter return false. A possible solution could look like the following:

    import 'package:flutter/widgets.dart';
    
    class TransparentRoute extends PageRoute {
      TransparentRoute({
        @required this.builder,
        RouteSettings settings,
      })  : assert(builder != null),
            super(settings: settings, fullscreenDialog: false);
    
      final WidgetBuilder builder;
    
      @override
      bool get opaque => false;
    
      @override
      Color get barrierColor => null;
    
      @override
      String get barrierLabel => null;
    
      @override
      bool get maintainState => true;
    
      @override
      Duration get transitionDuration => Duration(milliseconds: 350);
    
      @override
      Widget buildPage(BuildContext context, Animation animation,
          Animation secondaryAnimation) {
        final result = builder(context);
        return FadeTransition(
          opacity: Tween(begin: 0, end: 1).animate(animation),
          child: Semantics(
            scopesRoute: true,
            explicitChildNodes: true,
            child: result,
          ),
        );
      }
    }
    

    Keep in mind that this would also create a custom transition animation and behave differently than the more complex MaterialPageRoute (e.g. the swipe-back gesture would not work with the current implementation on iOS).

    You could use it like this:

    Navigator.of(context).push(
        TransparentRoute(builder: (BuildContext context) => YourSecondPage())
    );
    

    For more info on the PageRoute and the different implementers, head over to https://docs.flutter.io/flutter/widgets/PageRoute-class.html

提交回复
热议问题