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

后端 未结 3 881
余生分开走
余生分开走 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<void> {
      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<double> animation,
          Animation<double> secondaryAnimation) {
        final result = builder(context);
        return FadeTransition(
          opacity: Tween<double>(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

    0 讨论(0)
  • 2021-01-01 11:34

    you need to wrap your widget with opacity like this Opacity( opacity: 0.25, child: Container(child:Text('hello world')) )

    0 讨论(0)
  • 2021-01-01 11:49

    You also don't need to override any class, simply use:

    Navigator.of(context).push(
      PageRouteBuilder(
        opaque: false, // set to false
        pageBuilder: (_, __, ___) => Page2(),
      ),
    );
    
    0 讨论(0)
提交回复
热议问题