像iOS 13模态全屏一样的Flutter过渡

标签 flutter dart modal-dialog transition router

我想要 iOS-Modal-Transition,其中新屏幕从底部开始动画,旧屏幕被推到后面。我发现这个非常有前途的包:

modal_bottom_sheet

这是我用来显示模式的函数:

showCupertinoModalBottomSheet(
                  expand: true,
                  context: context,
                  builder: (context) => Container(
                    color: AppColors.blue,
                  ),
                );

然而,这并不能 100% 正确地工作,因为后面的 View 没有被推到后面。

我在这里缺少什么?如果有任何不清楚的地方请告诉我!

这是我的更多代码:

这是我的整个页面,我想从这里进行转换:

    class _MonthPageState extends State<MonthPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: AppColors.secondary,
      body: SafeArea(
        child: Stack(
          children: [
            ...
            Positioned(
              bottom: 10,
              right: 20,
              child: Hero(
                tag: widget.month.name + 'icon',
                child: AddButton(
                  onTapped: () {
                    showCupertinoModalBottomSheet(
                      expand: true,
                      context: context,
                      builder: (context) => Container(
                        color: AppColors.blue,
                      ),
                    );
                  },
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }

这是我的路由器:

    class AppRouter {
  static Route<dynamic> generateRoute(RouteSettings settings) {
    switch (settings.name) {
      case '/':
        return MaterialWithModalsPageRoute(
          builder: (context) => HomePage(),
        );
      case '/month':
        final Month month = settings.arguments as Month;
        return _buildTransitionToMonthPage(month);
      default:
        return MaterialPageRoute(
          builder: (_) => Scaffold(
            body: Center(
              child: Text('No route defined for ${settings.name}'),
            ),
          ),
        );
    }
  }

  static PageRouteBuilder _buildTransitionToMonthPage(Month month) {
    return PageRouteBuilder(
      transitionDuration: Duration(milliseconds: 450),
      reverseTransitionDuration: Duration(milliseconds: 450),
      pageBuilder: (BuildContext context, Animation<double> animation,
          Animation<double> secondaryAnimation) {
        return MonthPage(
          month: month,
        );
      },
      transitionsBuilder: (BuildContext context, Animation<double> animation,
          Animation<double> secondaryAnimation, Widget child) {
        return FadeTransition(opacity: animation, child: child);
      },
    );
  }
}

最佳答案

为了实现动画背后的插入,您需要将 CupertinoScaffoldCupertinoPageScaffold 一起使用,例如

  @override
  Widget build(BuildContext context) {
    return CupertinoScaffold(
      transitionBackgroundColor: Colors.white,
      body: Builder(
        builder: (context) => CupertinoPageScaffold(
          backgroundColor: Colors.white,
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Center(
                child: ElevatedButton(
                    child: Text('show modal'),
                    onPressed: () =>
                        CupertinoScaffold.showCupertinoModalBottomSheet(
                          expand: true,
                          context: context,
                          backgroundColor: Colors.white,
                          builder: (context) => Container(
                              color: Colors.white,
                              child: Center(
                                child: ElevatedButton(
                                  onPressed: () => Navigator.of(context)
                                      .popUntil((route) =>
                                          route.settings.name == '/'),
                                  child: Text('return home'),
                                ),
                              )),
                        )),
              ),
            ],
          ),
        ),
      ),
    );
  }

关于像iOS 13模态全屏一样的Flutter过渡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68090352/

相关文章:

javascript - jQuery 显示 div 不起作用

html - Bootstrap 模态不工作

Flutter:如何在没有后退按钮的情况下推送导航路线?

flutter - RangeError(索引): Invalid value: Not in range 0. .8,包括 : 9 in Gridview. 计数

dart - Dart 库中 "part"和 "part of"背后的原因是什么?

asynchronous - Flutter:从 Future 获取值(value)的正确方法

listview - Flutter(Dart):突出显示或选择onLongPress事件中的小部件(平铺或任何元素)

flutter - 将不同的类对象传递给函数

dart - 删除两位小数后的数字而不四舍五入其值?

javascript - 将 JQuery 对话框置于前面