Flutter中的透明PageRoute用于显示(半)透明页面

问题描述 投票:12回答:2

是否有可能使用具有透明背景的页面路由,以便我可以在现有页面的顶部显示(半)透明页面?

semi-transparent screen transition

dart flutter flutter-layout
2个回答
20
投票

是的,肯定!一种解决方案是扩展PageRoute并使opaque getter返回false。可能的解决方案如下所示:

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,
      ),
    );
  }
}

请记住,这还会创建自定义过渡动画,并且其行为与更复杂的MaterialPageRoute不同(例如,向后滑动手势不适用于iOS上的当前实现)。>>

您可以这样使用它:

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

有关PageRoute和不同实现者的更多信息,请转到https://docs.flutter.io/flutter/widgets/PageRoute-class.html


0
投票

您也不需要重写任何类,只需使用:

© www.soinside.com 2019 - 2024. All rights reserved.