37

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

半透明屏幕过渡

4

4 回答 4

69

您也不需要覆盖任何类,只需使用:

Navigator.of(context).push(
  PageRouteBuilder(
    opaque: false, // set to false
    pageBuilder: (_, __, ___) => Page2(),
  ),
);
于 2020-02-29T10:17:34.897 回答
36

当然是!一种解决方案是扩展PageRoute并使opaquegetter 返回 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

于 2019-02-07T11:16:43.543 回答
1

如果要进行材料页面路由转换,也可以使用此页面路由:

class MaterialTransparentRoute<T> extends PageRoute<T>
    with MaterialRouteTransitionMixin<T> {
  MaterialTransparentRoute({
    @required this.builder,
    RouteSettings settings,
    this.maintainState = true,
    bool fullscreenDialog = false,
  })  : assert(builder != null),
        assert(maintainState != null),
        assert(fullscreenDialog != null),
        super(settings: settings, fullscreenDialog: fullscreenDialog);

  final WidgetBuilder builder;

  @override
  Widget buildContent(BuildContext context) => builder(context);

  @override
  bool get opaque => false;

  @override
  final bool maintainState;

  @override
  String get debugLabel => '${super.debugLabel}(${settings.name})';
}

并像这样推送您的第二页:

Navigator.of(context).push(
    MaterialTransparentRoute(builder: (BuildContext context) => YourSecondPage())
);
于 2021-10-30T09:02:32.243 回答
-1

你需要像这样用不透明度包装你的小部件Opacity( opacity: 0.25, child: Container(child:Text('hello world')) )

于 2020-11-03T07:48:31.657 回答